Go编译产物能直接运行于Alpine镜像因其默认静态链接且不依赖libc但启用cgo后会动态链接glibc导致在Alpinemusl或scratch中报错。为什么 Go 编译产物能直接扔进 alpine 镜像因为 Go 默认静态链接生成的二进制不依赖 libc除非用了 cgo。所以最终镜像里根本不需要 glibc 或完整 Linux 发行版环境——用 scratch 或 alpine:latest 就够了。但注意一旦开了 cgo比如用了 net 包的 DNS 解析、或显式设了 CGO_ENABLED1二进制就会动态链接 libc这时扔进 scratch 会报 no such file or directory扔进 alpine 也会因 musl 和 glibc 不兼容而 exec format error 或崩溃。默认关闭 cgo构建时加 CGO_ENABLED0最稳妥必须开 cgo那就得在构建阶段用 golang:alpine musl-dev且最终镜像选 alpine 而非 scratch检查是否含 cgo 依赖ldd your-binary 输出为空 安全有 libc.so 等 动态链接不能进 scratchDockerfile 多阶段写法build 阶段只留 go 和源码别在 build 阶段装 git、curl、make 这些——Go 构建本身只需要 go 命令和源码。多装一个包就多一个攻击面、多几 MB 镜像体积、多一分缓存失效风险。典型错误是沿用 Python/Node 的习惯在 build 阶段 apt-get install 一堆工具或者把整个 ./ 拷进去含 go.mod、vendor、测试文件、README.md……。立即学习“go语言免费学习笔记深入” Murf AI AI文本转语音生成工具