alpine docker镜像内运行Go编译二进制文件提示not found问题求助
问题根源
你遇到的not found报错不是因为二进制文件真的不存在,而是二进制依赖的动态链接器不存在导致的:
- 官方
golang镜像默认基于Debian/Ubuntu,系统使用glibc作为C标准库,默认开启CGO的情况下编译出来的Go二进制会动态链接glibc的加载器/lib64/ld-linux-x86-64.so.2 - Alpine镜像使用
musl libc作为C标准库,默认没有glibc相关的依赖文件,系统自带的动态链接器路径是/lib/ld-musl-x86_64.so.1,和你编译的二进制依赖的加载器路径不匹配,所以shell执行时会抛出找不到文件的错误。
你可以在容器内执行ldd /main验证,输出结果会明确显示二进制依赖的动态链接器处于not found状态。
解决方案
常用的修复方式有两种:
方案1:编译时强制关闭CGO,产出完全静态的二进制
修改编译命令,添加CGO_ENABLED=0参数即可:
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" server/main.go
关闭CGO后编译出来的二进制没有任何动态链接依赖,可直接在Alpine中运行。
方案2:调整运行时环境适配现有二进制
- 可以在Alpine镜像中提前安装
glibc兼容包 - 也可以把运行时基础镜像换成
debian:bookworm-slim、ubuntu:jammy这类默认带glibc的轻量镜像,不需要修改编译逻辑就能直接运行现有二进制。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

