如何为Docker Alpine镜像构建静态Go二进制文件?

11
我想构建一个Go 1.9.2二进制文件并在Docker Alpine镜像上运行它。我编写的Go代码不调用任何C代码,同时使用了net包。但是,构建静态二进制文件并不总是像听起来那么简单。当我尝试执行二进制文件时,经常会出现加密信息提示二进制文件无法执行。虽然互联网上有很多关于这方面的信息,但大部分都以人们试错来让他们的二进制文件正常工作。
到目前为止,我发现以下方法可以解决问题,但我不知道原因,是否最优或是否可以简化。
env GOOS=linux GARCH=amd64 go install -v -a -tags netgo -installsuffix netgo -ldflags "-linkmode external -extldflags -static"

有没有一种规范的方法(如果存在的话)可以构建一个能够在Alpine 3.7 docker镜像上运行的Go二进制文件?如果这样做可以使事情更加高效/容易,我很乐意使用apk来安装Alpine镜像中的软件包。(我相信我需要安装ca-certificates。)

1个回答

10

是的,通常需要添加额外的资源文件,例如证书,特别是在使用像alpine这样的最小化发行版时,但是能够在这样小的分布上运行go应用程序通常也被视为优点。

要添加证书,这是一个非常好的解释,概述了如何在scratch容器上执行它:

https://blog.codeship.com/building-minimal-docker-containers-for-go-applications/

如果您想坚持使用alpine,则可以安装此软件包获取它们:

https://pkgs.alpinelinux.org/package/v3.7/main/x86/ca-certificates


5
第一个链接非常有帮助。这个命令似乎足够了 env GOOS=linux GARCH=amd64 CGO_ENABLED=0 go install -v -a -installsuffix cgo。Github上的问题 https://github.com/golang/go/issues/9344#issuecomment-69944514 也提供了解决方案。 - Dan
Alpine v3.3已经三年了,不再受支持。您应该链接最新版本,即https://pkgs.alpinelinux.org/package/v3.7/main/x86/ca-certificates。 - Jakub Jirutka

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