多阶段构建执行ENTRYPOINT报错:文件或目录不存在求助
解决Golang项目Docker镜像运行报错:standard_init_linux.go:228: exec user process caused: no such file or directory
你遇到的这个错误并非找不到包路径,而是编译生成的二进制文件与Alpine镜像的libc库不兼容导致的:
- Golang官方的
golang:1.19-buster镜像基于Debian系统,默认编译的Go程序动态链接到glibc库; - Alpine镜像使用的是musl libc,缺少glibc依赖,因此无法加载运行该二进制文件。
你去掉内部包引用后能正常运行属于偶然情况,本质问题仍为二进制兼容性。
方法1:静态编译Go程序(推荐)
禁用CGO并强制静态编译,让程序不依赖系统libc库,修改Dockerfile中的go build命令:
# refer https://github.com/GoogleCloudPlatform/cloud-run-hello/blob/master/placeholder.dockerfile FROM golang:1.19-buster as builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . ./ # 添加CGO_ENABLED=0,强制静态编译 RUN CGO_ENABLED=0 go build -o job github.com/demo/first-sub-project/hello/firstJob FROM alpine:3 RUN apk add --no-cache ca-certificates COPY --from=builder /app/job /job ENV TZ=Asia/Tokyo ENTRYPOINT ["/job"]
方法2:使用Alpine版Go镜像编译
如果项目需要CGO支持,可使用Alpine版Go镜像作为构建阶段,确保编译出的二进制适配musl libc:
FROM golang:1.19-alpine as builder WORKDIR /app # 安装CGO编译依赖 RUN apk add --no-cache git gcc musl-dev COPY go.mod go.sum ./ RUN go mod download COPY . ./ RUN go build -o job github.com/demo/first-sub-project/hello/firstJob FROM alpine:3 RUN apk add --no-cache ca-certificates COPY --from=builder /app/job /job ENV TZ=Asia/Tokyo ENTRYPOINT ["/job"]
验证静态编译结果
构建镜像后,可通过以下命令确认二进制文件为静态链接:
docker run --rm --entrypoint sh <你的镜像名> -c "file /job"
输出包含statically linked即说明编译成功。
内容的提问来源于stack exchange,提问作者user3523030
相关产品推荐
相关产品推荐

