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

Docker配合docker-compose部署Python应用挂载config.ini报KeyError问题

问题成因
  • 核心问题是Docker卷挂载的目标路径配置错误:容器有独立的文件系统,你配置的挂载目标/Users/my_user/my_local_dir_with_py_projects/config.ini是宿主机的本地路径,和容器内部路径完全无关。根据你的Dockerfile配置,容器内应用的工作目录是/app,app.py运行时会从当前工作目录读取config.ini,也就是找容器内的/app/config.ini文件,你的挂载规则根本没把配置文件放到这个位置。
  • 构建镜像时配置文件不在构建上下文中:你在my_py_app目录下执行build命令,构建上下文仅包含该目录下的文件,上一级目录的config.ini不会被复制进镜像,导致容器内/app路径下根本没有config.ini文件。
  • Python的configparser模块特性:读取不存在的配置文件时不会主动抛出文件不存在的异常,只会返回空的配置对象,当你尝试读取base_url配置项时就会触发KeyError,这也是你没有第一时间定位到文件缺失问题的原因。
  • 镜像标签不匹配:你构建镜像时打的标签是py-app(横杠分隔),但docker-compose中配置的镜像名是py_app:latest(下划线分隔),会导致compose无法使用你刚构建的镜像。
  • Dockerfile中WORKDIR写法不规范:使用相对路径app/设置工作目录存在路径歧义,虽然默认会落到/app路径,但不符合最佳实践。
修复方案

按以下步骤调整配置即可实现修改配置后仅重启容器就生效的需求:

  1. 修正Dockerfile内容,使用绝对路径设置工作目录,仅复制需要打进镜像的应用代码和依赖文件:
# syntax=docker/dockerfile:1
FROM python:3.10
# 用绝对路径定义工作目录,避免路径歧义
WORKDIR /app
COPY requirements.txt ./
RUN pip3 install --no-cache-dir -r requirements.txt
# 仅复制应用代码,配置文件通过挂载传入,不需要打进镜像
COPY app.py ./
  1. 修正docker-compose.yml配置,统一镜像标签,将配置文件正确挂载到容器内应用的读取路径:
version: '2.4'
services:
  py_app:
    # 镜像名和build时的标签保持一致
    image: py-app:latest
    restart: always
    volumes:
      # 冒号左侧是宿主机配置文件路径(相对于compose文件所在目录),右侧是容器内应用读取配置的绝对路径
      - "./config.ini:/app/config.ini:z" 
    ports:
      - "5005:5000"
    command: python3 app.py
  1. 按正确流程重新部署:
  • 进入my_py_app目录,重新构建镜像:docker build --tag py-app .
  • 回到my_local_dir_with_py_projects目录,清理旧的异常容器:docker-compose down
  • 启动服务:docker-compose up -d(加-d参数可后台运行容器)

调整完成后,你直接修改宿主机上的config.ini文件,执行docker-compose restart即可加载新配置,完全不需要重新构建镜像。

内容的提问来源于stack exchange,提问作者ievgenii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:42:28