在golang中创建静态二进制文件所需的标志



我正在使用scratch作为基础构建Docker映像。

以下构建命令:

RUN go build -o /go/bin/myapp

创建了一个二进制文件,在执行时一直失败:

standard_init_linux.go:211: exec user process caused "no such file or directory"

通过尝试和错误,我发现我需要建立如下:

RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' . 

为什么CGO_ENABLED=0-ldflags '-extldflags "-static"'都是必需的?

这两个选项不是都创建静态二进制文件吗?(即二进制文件在运行环境中的库方面完全不需要任何东西?(

就在我们开始之前,Russ Cox's的提醒:Comment

同样阅读:评论

是的,我同意Volker的评论,即有些系统实际上不允许静态二进制文件。

继续阅读:编译包和依赖

-a
force rebuilding of packages that are already up-to-date.
-ldflags '[pattern=]arg list'
arguments to pass on each go tool link invocation.

阅读:转到工具链接

-extldflags flags
Set space-separated flags to pass to the external linker.

因此,它试图在禁用CGO的情况下重建所有包(依赖项(,并且-static意味着不链接共享库。

与静态链接相关的一些要点得到了很好的解释:静态链接golang

最新更新