为了账号安全,请及时绑定邮箱和手机立即绑定

用于 Docker 机器的 Golang Mac OSX 构建

用于 Docker 机器的 Golang Mac OSX 构建

Go
哆啦的时光机 2021-12-20 19:12:46
我需要在 Docker 机器上运行 Golang 应用程序。我在 Mac OSX 上工作,而 Docker 在 Linux 虚拟机上工作,所以在 Mac 上构建的二进制文件不能在 Docker 上运行。我在这里看到两种方法:在 Mac 上为 Linux OS 交叉编译二进制文件将项目源复制到 docker,在其上运行“go get”和“go build”第一个很难,因为 CGO(它在一些导入的库中使用)。由于“go get”操作,第二个非常慢。你能告诉我,在那种情况下哪种方式最常见?或者也许我做错了什么?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这是一个即使使用 CGO 也可以使交叉编译变得超级简单的解决方案。

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

https://github.com/karalabe/xgo

非常感谢 Péter Szilágyi 别名 karalabe 为这个非常棒的包!

如何使用:

  • 让 Docker 运行

  • 去 github.com/karalabe/xgo

  • xgo --targets=windows/amd64 ./

还有很多选择!

- 编辑 -

差不多 3 年后,我不再使用它了,但是我的 docker 镜像在基于 linux 的 CD 管道中构建我的应用程序仍然基于xgo.


查看完整回答
反对 回复 2021-12-20
?
皈依舞

TA贡献1851条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-12-20
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我使用第一种方法。这是构建代码的吞咽任务。如果设置了生产标志,它将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;

});


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信