Docker容器中导入basic_config模块报ModuleNotFoundError求助
解决Docker容器中ModuleNotFoundError: No module named 'basic_config'问题
问题背景
运行Docker容器时执行src/model/model1/model.py,出现ModuleNotFoundError: No module named 'basic_config'错误,但代码在Windows本地和Linux服务器上运行正常。相关文件结构、代码及Docker配置如下:
文件结构
ml-project/ enviroment/ env.dev env.prod src/ config/ base_config.py model/ model1/ model.py .env piplines.yml requirements.txt
model.py代码
import sys sys.path.append("../../config") from basic_config import AGE print(AGE)
Dockerfile内容
FROM python:3.8 WORKDIR /app COPY . . ARG env_type=dev RUN pip install -r requirements.txt CMD ["python", "src/module/model1/model.py"]
(注:Dockerfile中src/module/model1/model.py应为src/model/model1/model.py,属于笔误,需修正)
问题原因
核心问题是相对路径的解析基准不一致:
- 本地运行时,你大概率是在
src/model/model1/目录下执行python model.py,此时../../config会正确定位到src/config/并加入Python路径; - 但Docker容器中工作目录是
/app,执行python src/model/model1/model.py时,../../config是相对于/app解析的,实际路径变成/app/../../config,完全偏离了正确的/app/src/config路径,导致模块找不到。
解决方案
方案1:基于文件绝对路径动态添加路径
修改model.py,通过当前文件的绝对路径推导config目录位置,彻底摆脱工作目录限制:
import sys from pathlib import Path # 获取当前文件所在目录的父级父级父目录(即src/目录) src_root = Path(__file__).parent.parent.parent # 拼接得到config目录的绝对路径 config_dir = src_root / "config" # 添加到Python路径 sys.path.append(str(config_dir)) from basic_config import AGE print(AGE)
方案2:将src目录加入Python全局路径(推荐)
这种方式更符合Python模块化规范,维护性更强:
- 先在
src/config/目录下创建空的__init__.py文件,让Python将config识别为合法模块; - 修改Dockerfile,把
/app/src加入PYTHONPATH环境变量:
FROM python:3.8 WORKDIR /app COPY . . ARG env_type=dev RUN pip install -r requirements.txt # 将src目录添加到Python搜索路径 ENV PYTHONPATH="/app/src:${PYTHONPATH}" CMD ["python", "src/model/model1/model.py"]
- 简化model.py的导入语句:
from config.base_config import AGE print(AGE)
方案3:调整Docker工作目录匹配本地运行逻辑
把Docker的工作目录切换到/app/src,让相对路径解析逻辑和本地一致:
FROM python:3.8 WORKDIR /app/src COPY . . ARG env_type=dev # 注意requirements.txt的路径变为../requirements.txt RUN pip install -r ../requirements.txt CMD ["python", "model/model1/model.py"]
此时model.py原有的../../config会正确解析为/app/src/config,无需修改代码。
内容的提问来源于stack exchange,提问作者Yasiru Ayeshmantha
相关产品推荐
相关产品推荐

