Go语言多阶段Docker构建报错:容器启动提示文件不存在
问题分析与解决方案
错误原因
你的多阶段构建存在两处关键错误:
- 编译输出路径错误:在build阶段,
RUN CGO_ENABLED=0 go build -o /app中,/app是你之前通过WORKDIR创建的目录,Go编译器会将二进制文件以你的Go模块名命名,输出到该目录下(而非生成名为/app的文件)。例如如果你的模块名是demo,生成的文件会是/app/demo,而非你预期的/app/app。 - 文件复制逻辑不匹配:后续
COPY --from=build /app /app是将整个/app目录复制到scratch阶段的/app目录下,但里面的二进制文件名并非app,导致ENTRYPOINT ["/app/app"]找不到指定文件。
修正后的多阶段Dockerfile
将build阶段的编译命令改为明确输出到/app/app,确保复制后的路径与ENTRYPOINT匹配:
FROM golang:1.21.5 AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # 明确指定输出文件为/app/app,与最终启动路径一致 RUN CGO_ENABLED=0 go build -o /app/app FROM scratch WORKDIR /app # 从build阶段复制编译好的二进制文件到目标路径 COPY --from=build /app/app /app/app EXPOSE 4000 ENTRYPOINT ["/app/app"]
优化建议
你也可以将build阶段的二进制文件输出到独立目录(如/bin),避免与项目目录混淆,让结构更清晰:
FROM golang:1.21.5 AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # 输出到根目录的bin目录下,隔离编译产物与项目文件 RUN CGO_ENABLED=0 go build -o /bin/app FROM scratch # 直接复制到目标路径,无需额外设置WORKDIR COPY --from=build /bin/app /app/app EXPOSE 4000 ENTRYPOINT ["/app/app"]
内容的提问来源于stack exchange,提问作者Akashgreninja
相关产品推荐
相关产品推荐

