我正在使用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