Docker容器内应用无法定位CSV文件 如何修改Dockerfile修复
问题根因
你遇到的文件不存在问题由两个错误导致:
- 多阶段构建的最终运行镜像阶段,你仅复制了编译后的Go二进制文件,没有将CSV文件复制到最终可运行的镜像层
- 你代码里写死的
/app/health-check/challenge_dataset.csv是编译阶段临时构建容器内的路径,这个目录在最终的distroless运行镜像里根本不存在,自然无法找到文件
修复步骤
1. 修改Dockerfile配置
在最终部署阶段增加CSV文件的复制逻辑,修改后的完整Dockerfile如下:
# syntax=docker/dockerfile:1 ## ## 构建阶段 ## FROM golang:1.18-buster AS build WORKDIR /app COPY health-check/ . # 如果你选择把CSV文件放在health-check目录下,打开下面这行注释 # COPY challenge_dataset.csv . RUN go mod download RUN go build -o /health-check-ping ## ## 部署运行阶段 ## FROM gcr.io/distroless/base-debian10 WORKDIR / COPY --from=build /health-check-ping /health-check-ping # 新增:将项目根目录的file.csv复制到最终镜像的根目录 COPY file.csv /file.csv # 如果你把CSV放在health-check目录下,注释掉上面的COPY行,打开下面这行从构建阶段复制文件 # COPY --from=build /app/challenge_dataset.csv /challenge_dataset.csv EXPOSE 8080 USER nonroot:nonroot ENTRYPOINT ["/health-check-ping"]
2. 调整代码中的文件路径
不要使用相对路径或者构建阶段的临时路径,直接使用最终镜像内的绝对路径打开文件:
- 如果用根目录的
file.csv复制到镜像根目录的方案,代码写为os.Open("/file.csv") - 如果用把CSV移到health-check目录、复制到镜像根目录命名为
challenge_dataset.csv的方案,代码写为os.Open("/challenge_dataset.csv")
提示:Go编译生成的是单二进制文件,不会携带构建阶段的目录结构,所有运行时依赖的静态文件都必须单独复制到最终运行镜像中,且路径必须和最终镜像内的实际存储路径完全匹配。
内容的提问来源于stack exchange,提问作者yung peso
相关产品推荐
相关产品推荐

