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

时间:2016-03-14 21:01:32

标签: linux macos go build docker

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

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

我在这里看到两种方式:

  1. 在Mac上为Linux OS交叉编译二进制文件
  2. 将项目源复制到docker,运行'go get'和'go build'就可以了
  3. 第一个很难因为CGO(它在一些导入的库中使用)。

    由于'go get'操作,第二个非常慢。

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

3 个答案:

答案 0 :(得分:2)

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

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

https://github.com/karalabe/xgo

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

使用方法:

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

还有更多选择!

答案 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目录。运行容器并从容器中生成可执行文件。最终得到的二进制文件可以在不同的操作系统上运行。