You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言多阶段Docker构建报错:容器启动提示文件不存在

问题分析与解决方案

错误原因

你的多阶段构建存在两处关键错误:

  1. 编译输出路径错误:在build阶段,RUN CGO_ENABLED=0 go build -o /app 中,/app 是你之前通过WORKDIR创建的目录,Go编译器会将二进制文件以你的Go模块名命名,输出到该目录下(而非生成名为/app的文件)。例如如果你的模块名是demo,生成的文件会是/app/demo,而非你预期的/app/app。
  2. 文件复制逻辑不匹配:后续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:22:44