用于 Docker 机器的 Golang Mac OSX 构建

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

我在 Mac OSX 上工作,而 Docker 在 Linux 虚拟机上工作,所以在 Mac 上构建的二进制文件不能在 Docker 上运行。

我在这里看到两种方法:

  1. 在 Mac 上为 Linux OS 交叉编译二进制文件

  2. 将项目源复制到 docker,在其上运行“go get”和“go build”

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

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

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


哆啦的时光机
浏览 248回答 3
3回答

开心每一天1111

这是一个即使使用 CGO 也可以使交叉编译变得超级简单的解决方案。我最近在浪费大量时间获得一个新的 Windows 构建服务器来构建我的 Go 应用程序后偶然发现了它。现在我只是在我的 Mac 上编译它,并用它创建一个 Linux 构建服务器:https://github.com/karalabe/xgo非常感谢 Péter Szilágyi 别名 karalabe 为这个非常棒的包!如何使用:让 Docker 运行去 github.com/karalabe/xgoxgo --targets=windows/amd64 ./还有很多选择!- 编辑 -差不多 3 年后,我不再使用它了,但是我的 docker 镜像在基于 linux 的 CD 管道中构建我的应用程序仍然基于xgo.

皈依舞

您可以从可执行文件所需的不同操作系统创建一个 Docker 容器,并将卷映射到您的 src 目录。运行容器并从容器内生成可执行文件。您最终会得到一个可以在不同操作系统上运行的二进制文件。

泛舟湖上清波郎朗

我使用第一种方法。这是构建代码的吞咽任务。如果设置了生产标志,它将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;});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go