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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:18:44