我使用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"'
都是必需的?
这两个选项是否都创建静态二进制文件?(即,完全不需要运行环境中的库的二进制文件?)
1条答案
按热度按时间3zwjbxry1#
就在我们开始之前,拉斯·考克斯提醒我们:备注
请同时阅读以下内容:备注
是的,我同意Volker的评论,即一些系统并不真正允许静态二进制文件。
继续阅读:编译软件包和依赖项
读取:go tool link
因此,它尝试在禁用CGO的情况下重建所有包(以及依赖项),并且
-static
表示不链接共享库。与静态链接相关的一些要点得到了很好的解释:Linking golang statically