You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:22:13