【发布时间】:2020-08-02 18:59:21
【问题描述】:
我正在使用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"' 都需要?
这两个选项都不会创建静态二进制文件吗? (即,在它们将运行的环境中完全不需要任何库的二进制文件?)
【问题讨论】:
-
有些系统并不真正允许完全静态的二进制文件。如果您使用系统提供的东西(例如名称解析),其他工作会更好。禁用 cgo 可确保不使用 C 代码,而 -static 指示链接器静态链接所有内容。
标签: go build compilation