繁体   English   中英

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

[英]Golang Mac OSX build for Docker machine

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

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

我在这里看到两种方式:

  1. 在Mac上为Linux OS交叉编译二进制文件
  2. 将项目源复制到docker,在其上运行'go get'和'go build'

第一个是因为CGO(它在一些导入的库中使用)很难。

其次是因为'go get'操作而非常缓慢。

你能告诉我,在那种情况下哪种方式最常见? 或者也许我做错了什么?

这里有一个解决方案,即使使用CGO,交叉编译也非常容易。

在浪费了大量时间来获得一个新的Windows构建服务器来构建我的Go应用程序后,我最近偶然发现了它。 现在我只需在Mac上编译它,然后用它创建一个Linux构建服务器:

https://github.com/karalabe/xgo

非常感谢PéterSzilágyi别名karalabe这个非常棒的套餐!

如何使用:

  • 让Docker运行
  • 去获取github.com/karalabe/xgo
  • xgo --targets = windows / amd64 ./

还有更多选择!

- 编辑 -

差不多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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM