Docker多阶段构建运行Go服务提示config.properties不存在的问题咨询
问题根因
当前多阶段Docker构建的文件传递存在遗漏:
- 第一阶段(golang编译环境)虽然把
config.properties拷到了临时构建目录/app下,但这个目录只是编译用的临时环境,最终生成的运行镜像不会自动包含这里的全部文件,只有手动从这个阶段往外COPY的文件才会进到最终镜像内 - 最终镜像设置的工作目录是
/dbt,Go程序启动时会在当前工作目录(也就是/dbt)下寻找config.properties,但你之前只把编译好的server二进制拷到了这个目录,没有放置配置文件,自然会报文件不存在的错误
修复方案
只需要在最终运行镜像的构建步骤中,把config.properties补拷到/dbt目录即可,两种写法任选其一:
- 从builder阶段转拷(和现有传递server二进制的逻辑保持一致)
在Dockerfile的最终构建段新增一行拷贝指令,修改后的核心片段如下:FROM fishtownanalytics/dbt:0.19.0 USER root WORKDIR /dbt # 原有拷贝server的逻辑保留 COPY --from=builder /app/server ./ # 新增:将构建阶段的config.properties同步到当前工作目录 COPY --from=builder /app/config.properties ./ COPY script.sh ./ COPY jaffle-shop ./ ENTRYPOINT ["./server"] - 直接从本地构建上下文拷贝(流程更直接,因为本地的
config.properties本来就和Dockerfile处于同一目录)
把上面的新增拷贝指令替换为:COPY ./config.properties ./
注意事项
- 配置文件本身是
key=value格式,不需要做特殊适配,只要文件存放路径和Go程序读取的相对路径匹配(当前程序读取的就是工作目录下的config.properties),程序就能正常解析 - 你之前写的构建命令漏了末尾的构建上下文标识,修正后正确的构建命令为:
docker build -t sample:v1 . - 你现有的运行命令不需要做调整:
PORT=8080 && docker run -p 9090:${PORT} -e PORT=${PORT} sample:v1
内容的提问来源于stack exchange,提问作者user2761431
相关产品推荐
相关产品推荐

