运行docker-compose up api时遇ModuleNotFoundError: No module named 'routers'
解决ModuleNotFoundError: No module named 'routers'问题
核心原因
Python解释器在当前模块搜索路径中找不到routers模块,结合你的Docker配置和项目结构,分两种常见场景给出解决办法:
场景1:routers是api目录下的子文件夹
如果你的项目结构为api/routers/patients.py,问题出在导入逻辑或Python路径配置:
方案A:使用相对导入
修改api/main.py中的导入语句为相对路径格式:
from .routers.patients import router as PatientsRouter
方案B:将api目录加入Python搜索路径
在Dockerfile中添加环境变量,把/project/api纳入Python模块搜索路径:
FROM python:3.9-slim-buster WORKDIR /project COPY ./requirements.txt . RUN pip install -r requirements.txt COPY ./api /project/api/ # 添加PYTHONPATH配置 ENV PYTHONPATH=/project/api CMD ["uvicorn", "main:app", "--host=0.0.0.0", "--port=8000"] EXPOSE 8000
同时更新docker-compose的启动命令:
command: ["uvicorn", "main:app", "--host=0.0.0.0", "--port=8000"]
场景2:routers是与api同级的根目录文件夹
如果项目根目录下存在独立的routers文件夹(和api平级),问题是Docker构建时未复制该目录到容器内:
解决方案:更新Dockerfile和docker-compose配置
- 修改Dockerfile,同步复制
routers目录:
FROM python:3.9-slim-buster WORKDIR /project COPY ./requirements.txt . RUN pip install -r requirements.txt # 同时复制api和routers目录 COPY ./api /project/api/ COPY ./routers /project/routers/ CMD ["uvicorn", "api.main:app", "--host=0.0.0.0", "--port=8000"] EXPOSE 8000
- 更新docker-compose的volumes配置,挂载
routers目录:
version: "3.8" services: api: build: . command: ["uvicorn", "api.main:app", "--host=0.0.0.0", "--port=8000"] volumes: - ./api:/project/api - ./routers:/project/routers ports: - "8000:8000"
内容的提问来源于stack exchange,提问作者Matheus
相关产品推荐
相关产品推荐

