file ./app
ldd ./app
CGO_ENABLED=0 GOOS=linux go build -o app .
docker run --rm alpine:3.19 ./app --version

本地编译好的二进制拷到 alpine 容器里,启动只报 `sh: ./app: not found`,用 ls 看文件明明在,权限也是可执行的,换到 ubuntu 镜像里同一个文件却能跑起来。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:启用 cgo 后链接的是 glibc,alpine 用的是 musl,动态加载器路径对不上,内核找不到解释器就报 not found,这个提示指的是加载器而不是二进制本身,容易往文件丢失上查。

「cgo 动态库缺失」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:用依赖查看命令确认这个二进制链接了哪些库;改成关闭 cgo 的静态编译方式,重新出一个包再看;确实要用 cgo,就换成对应的基础镜像重新测一遍。

确认没问题再收工,文件类型显示为静态链接,容器里能正常启动并打印版本号。

作者 9823189