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

pka*_*mol 7 compilation build go

我正在构建一个 Docker 镜像作为scratch基础。

以下构建命令:

RUN go build -o /go/bin/myapp
Run Code Online (Sandbox Code Playgroud)

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

standard_init_linux.go:211: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

通过反复试验,我发现我需要构建如下:

RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' . 
Run Code Online (Sandbox Code Playgroud)

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

这两个选项都不会创建静态二进制文件吗?(即二进制文件在其运行环境中完全不需要任何库?)

p9s*_*9sh 4

在我们开始之前,拉斯·考克斯 (Russ Cox) 的提醒:评论

另请阅读此内容:评论

是的,我同意 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.
Run Code Online (Sandbox Code Playgroud)

阅读:go 工具链接

-extldflags flags
    Set space-separated flags to pass to the external linker.
Run Code Online (Sandbox Code Playgroud)

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

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