构建适用于Docker机器的Mac OSX的Golang版本

7

我需要在Docker机器上运行Golang应用程序。

我正在使用Mac OSX,而Docker是在Linux虚拟机上运行的,因此在Mac上构建的二进制文件无法在Docker上运行。

我看到两种方法:

  1. 在Mac上交叉编译二进制文件以供Linux OS使用
  2. 将项目源代码复制到Docker中,在其中运行'go get'和'go build'

第一种方法由于CGO(它在某些导入的库中使用)而较难。

第二种方法非常慢,因为涉及到'go get'操作。

请问,在这种情况下哪种方法最常见?或者我做错了什么吗?


3
Docker会缓存镜像层,并允许您从特定镜像开始构建。在Dockerfile中将命令分解为尽可能多的层次,这样您就可以重复使用这些层次,且只需构建自己的软件包即可对源代码进行更改。 - JimB
JimB,但是我该如何拆分“go get”命令?运行RUN go get package1 /n RUN go get package2...等等,它们会被缓存吗? - i.van
4
不要使用go get,或者至少创建一个包含它的基础镜像并从那里开始(go get不应在生产中使用,因此大多数人都有其他方法来管理依赖项)。在单个Dockerfile中的基本解决方案是创建一个Makefile或脚本以按需安装所有依赖项,并将其放在单个RUN语句中。 - JimB
我已经理解了,谢谢! - i.van
3个回答

3

这里有一个解决方案,使交叉编译变得非常容易,即使涉及CGO。

最近我在新的Windows构建服务器上构建Go应用程序时浪费了很多时间,但现在我只需在Mac上进行编译,并将其与Linux构建服务器一起使用:

https://github.com/karalabe/xgo

非常感谢Péter Szilágyi(化名karalabe)提供了这个真正棒的包!

如何使用:

  • 确保Docker正在运行
  • go get github.com/karalabe/xgo
  • xgo --targets=windows/amd64 ./

还有很多其他选项!

--编辑--

近三年后,我不再使用这个工具,但我的Docker镜像仍基于xgo中使用的Docker镜像,在基于Linux的CD管道中构建我的应用程序。


0
我使用第一种方法。下面是一个 Gulp 任务,用于构建 Go 代码。如果设置了生产标志,它将运行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;
});

0
你可以从所需的操作系统中创建一个Docker容器,并将卷映射到你的src目录。在容器内运行并从容器内部制作可执行文件。这样,你就可以得到一个可以在不同操作系统上运行的二进制文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接