Docker化Golang程序运行报错/bin/sh: ./crawler: not found如何排查
问题定位方法
- 验证二进制文件是否存在且权限正常:启动容器时覆盖默认命令执行
ls -l /crawler,确认文件存在且有可执行权限,参考命令:docker run --rm <你的镜像名称> ls -l /crawler - 检查二进制的动态链接依赖:执行命令查看依赖是否缺失:
docker run --rm --entrypoint=ldd <你的镜像名称> /crawler,如果输出中存在not found的动态库文件,即可确认是系统依赖不匹配导致的问题。 - 确认编译阶段的cgo开关状态:当前构建镜像
golang:1.16-buster默认开启cgo,编译出的二进制会动态链接glibc,而运行镜像alpine:latest使用的是musl libc,没有内置glibc,这是该报错最常见的触发原因。
修复方案
- 方案一(最推荐):编译阶段关闭cgo生成纯静态二进制,修改构建阶段的编译命令为:
RUN CGO_ENABLED=0 GOOS=linux go build -o crawler cmd/main.go
关闭cgo后生成的二进制不依赖任何系统动态库,可直接在alpine环境运行。
- 方案二:更换运行基础镜像为debian系镜像,和构建环境的libc保持一致,将最终阶段的基础镜像替换为:
FROM debian:buster-slim
该镜像自带glibc,可直接兼容动态链接的Go二进制。
- 方案三:如果必须使用alpine作为运行镜像,可在alpine阶段安装glibc兼容包:
RUN apk add --no-cache libc6-compat
内容的提问来源于stack exchange,提问作者Ahmet Hudayberdyyev
相关产品推荐
相关产品推荐

