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

lmvvr0a8  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(148)

我使用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"'都是必需的?
这两个选项是否都创建静态二进制文件?(即,完全不需要运行环境中的库的二进制文件?)

3zwjbxry

3zwjbxry1#

就在我们开始之前,拉斯·考克斯提醒我们:备注
请同时阅读以下内容:备注
是的,我同意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.

读取:go tool link

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

因此,它尝试在禁用CGO的情况下重建所有包(以及依赖项),并且-static表示不链接共享库。
与静态链接相关的一些要点得到了很好的解释:Linking golang statically

相关问题