Docker中的FastAPI - 主模块未找到错误

0 投票
1 回答
51 浏览
提问于 2025-04-13 20:44

我有一个在本地运行的fastAPI应用,现在我想把它放到docker里。我按照文档中的说明操作。但是当我启动这个容器时,它就停止了。日志显示了以下内容:

  File "/code/./app/main.py", line 12, in <module>
    from database import get_session
ModuleNotFoundError: No module named 'database'

这是我的Dockerfile:

# 
FROM python:3.10
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

我用sudo docker run -it fastapi bash检查文件是否存在,发现所有文件都在:

root@d6d938b2a0da:/code/app# ls -la
total 40
drwxr-xr-x 3 root root  4096 Mar 17 12:28 .
drwxr-xr-x 1 root root  4096 Mar 17 12:31 ..
-rw-rw-r-- 1 root root     0 Mar 16 19:58 __init__.py
-rw-rw-r-- 1 root root   744 Mar 16 19:58 database.py
-rw-rw-r-- 1 root root 12288 Mar 17 12:26 db.sqlite3
-rw-rw-r-- 1 root root  1170 Mar 16 19:58 main.py
-rw-rw-r-- 1 root root   602 Mar 16 19:58 models.py
-rw-rw-r-- 1 root root  2942 Mar 16 19:58 populate.py
drwxrwxr-x 2 root root  4096 Mar 16 19:58 templates

为什么在docker里,main.py无法从database.py加载呢?

路径中的点“/code/./app/main.py”看起来有点可疑。不过main.py是可以启动的……

1 个回答

0

这不是一个Docker的问题。你对Python的导入机制有些混淆。

你的当前工作目录是 /code,而你的文件安装在 /code/app 里。从Python的角度来看,你所有的模块都在 app 这个包里。这就是为什么你的 uvicorn 命令行提到模块 app.main

你需要修改你的代码,使用绝对导入:

from app.database import get_session

或者使用相对导入:

from .database import get_session

撰写回答