基于FastAPI的Docker后端模块导入问题求助
问题
运行FastAPI后端服务时遇到以下导入错误:
File "/app/main.py", line 6, in <module> backend-backend-1 | from app.api.api_v1.api import api_router backend-backend-1 | ModuleNotFoundError: No module named 'app'
项目本地文件结构:
--backend |---app |------models |------schemas |------etc |------api |------main.py
Dockerfile内容:
FROM python:3.9 ENV PYTHONUNBUFFERED=1 COPY requirements.txt /tmp/requirements.txt RUN pip install --no-cache-dir -r /tmp/requirements.txt COPY ./app /app WORKDIR /app/ ENV PYTHONPATH=/app EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
打印sys.path输出:
['', '/usr/local/bin', '/app', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9', '/usr/local/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/site-packages']
原因分析
核心问题是容器内目录结构与导入语句不匹配:
- 本地项目中,
main.py位于backend/app/下,执行from app.api...时,Python会以backend为根目录查找app包。 - 但Dockerfile里的
COPY ./app /app直接把本地backend/app下的所有文件复制到了容器的/app目录,导致容器内结构变成/app/main.py、/app/api/、/app/models/,而非预期的/app/app/main.py。 - 此时在
/app/main.py里执行from app.api...,Python会去寻找/app/app/api路径,该路径不存在,因此触发导入错误。
解决办法
任选以下两种方案之一即可:
方案1:修改导入语句
将main.py中的导入语句调整为直接导入模块:
# 替换原导入语句 from api.api_v1.api import api_router
方案2:调整Dockerfile复制逻辑
修改Dockerfile,保留本地项目的app包结构,同时调整启动命令:
FROM python:3.9 ENV PYTHONUNBUFFERED=1 COPY requirements.txt /tmp/requirements.txt RUN pip install --no-cache-dir -r /tmp/requirements.txt # 将本地backend目录下所有内容复制到容器/app COPY . /app WORKDIR /app/ ENV PYTHONPATH=/app EXPOSE 8000 # 启动命令指向app包下的main模块 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
内容的提问来源于stack exchange,提问作者AfonsoSalgadoSousa
相关产品推荐
相关产品推荐

