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路径,但不符合最佳实践。
修复方案
按以下步骤调整配置即可实现修改配置后仅重启容器就生效的需求:
- 修正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 ./
- 修正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
- 按正确流程重新部署:
- 进入
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
相关产品推荐
相关产品推荐

