我需要在Docker机器上运行Golang应用程序。
我正在使用Mac OSX,而Docker正在使用Linux虚拟机,因此在Mac上构建的二进制文件无法在Docker上运行。
我在这里看到两种方式:
第一个很难因为CGO(它在一些导入的库中使用)。
由于'go get'操作,第二个非常慢。
请告诉我,在这种情况下哪种方式最常见?或者也许我做错了什么?
答案 0 :(得分:2)
这里有一个解决方案,即使使用CGO也可以使交叉编译变得非常容易。
我最近偶然发现它浪费了很多时间来获得一个新的Windows构建服务器来构建我的Go应用程序。 现在我只需在Mac上编译它,然后用它创建一个Linux构建服务器:
https://github.com/karalabe/xgo
非常感谢PéterSzilágyi别名karalabe这个非常棒的套餐!
使用方法:
还有更多选择!
答案 1 :(得分:0)
我使用第一种方法。这是一个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;
});
答案 2 :(得分:0)
您可以从可执行文件所需的不同操作系统创建Docker容器,并将卷映射到src目录。运行容器并从容器中生成可执行文件。最终得到的二进制文件可以在不同的操作系统上运行。