[英]Golang Mac OSX build for Docker machine
我需要在Docker机器上运行Golang应用程序。
我正在使用Mac OSX,而Docker正在使用Linux虚拟机,因此在Mac上构建的二进制文件无法在Docker上运行。
我在这里看到两种方式:
第一个是因为CGO(它在一些导入的库中使用)很难。
其次是因为'go get'操作而非常缓慢。
你能告诉我,在那种情况下哪种方式最常见? 或者也许我做错了什么?
这里有一个解决方案,即使使用CGO,交叉编译也非常容易。
在浪费了大量时间来获得一个新的Windows构建服务器来构建我的Go应用程序后,我最近偶然发现了它。 现在我只需在Mac上编译它,然后用它创建一个Linux构建服务器:
https://github.com/karalabe/xgo
非常感谢PéterSzilágyi别名karalabe这个非常棒的套餐!
如何使用:
还有更多选择!
- 编辑 -
差不多3年后,我不再使用它了,但我的docker镜像在基于linux的CD管道中构建我的应用程序仍然基于xgo
使用的xgo
。
我使用第一种方法。 这是一个gulp任务build build代码。 如果设置了生产标志,则运行GOOS=linux CGO_ENABLED=0 go build
而不是go build
。 所以二进制文件将在docker容器中工作
gulp.task('server:build', function () {
var build;
let options = {
env: {
'PATH': process.env.PATH,
'GOPATH': process.env.GOPATH
}
}
if (argv.prod) {
options.env['GOOS'] = 'linux'
options.env['CGO_ENABLED'] = '0'
console.log("Compiling go binarie to run inside Docker container")
}
var output = argv.prod ? conf.paths.build + '/prod/bin' : conf.paths.build + '/dev/bin';
build = child.spawnSync('go', ['build', '-o', output, "src/backend/main.go"], options);
if (build.stderr.length) {
var lines = build.stderr.toString()
.split('\n').filter(function(line) {
return line.length
});
for (var l in lines)
util.log(util.colors.red(
'Error (go install): ' + lines[l]
));
notifier.notify({
title: 'Error (go install)',
message: lines
});
}
return build;
});
您可以从可执行文件所需的不同操作系统创建Docker容器,并将卷映射到src目录。 运行容器并从容器中生成可执行文件。 您最终会得到一个可以在不同操作系统上运行的二进制文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.