我正在使用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带领您:Comment

同时阅读:Comment

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

继续阅读:Compile packages and dependencies

-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

关于go - 在golang中创建静态二进制文件所需的标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61319677/

10-15 07:30