Docker容器中Python无法读取同目录JSON文件的解决咨询
问题分析
报错的核心原因是:通过pip install .安装dataset_generator包时,默认打包规则不会将oddsgenie-firebase.json这类非Python文件纳入安装后的包目录,导致容器内/usr/local/lib/python3.11/site-packages/dataset_generator/firebase/路径下缺失该文件。
解决方案
1. 添加打包配置文件MANIFEST.in
在comp702根目录下创建MANIFEST.in文件,写入以下内容:
include dataset_generator/firebase/oddsgenie-firebase.json
该文件用于告知Python打包工具(setuptools),在打包时必须包含指定的JSON文件。
2. 配置项目打包规则
根据项目使用的配置文件类型,补充对应设置:
若使用setup.py
确保setup.py中包含include_package_data=True配置:
from setuptools import setup, find_packages setup( name="dataset_generator", version="0.1", packages=find_packages(), include_package_data=True, # 开启自动包含MANIFEST.in指定的文件 )
若使用pyproject.toml(现代Python项目推荐)
在pyproject.toml中添加以下配置:
[tool.setuptools] include-package-data = true
3. 优化Docker构建(可选)
调整Dockerfile的文件复制顺序,利用Docker缓存提升构建速度:
FROM python:3.11 COPY requirements.txt . RUN pip install -r requirements.txt # 先复制打包相关文件,避免代码修改触发重复安装 COPY MANIFEST.in . COPY dataset_generator/ ./dataset_generator/ COPY setup.py . # 若用pyproject.toml则替换为该文件 RUN pip install . # 最后复制业务代码 COPY application/ ./application/ CMD ["python3", "application/scheduler.py"]
验证逻辑
修改完成后,执行pip install .时,oddsgenie-firebase.json会被打包并同步安装到容器内的包目录中,你的代码通过os.path.dirname(os.path.abspath(__file__))获取的路径就能正确定位到该JSON文件,解决文件找不到的问题。
内容的提问来源于stack exchange,提问作者James O'Neill
相关产品推荐
相关产品推荐

