我有一个具有以下结构的项目:
project/
checks/
__init__.py
<some files here>
engine/
__init__.py
<some files here>
models/
__init__.py
<some files here>
__init__.py
logger.py
main.py
requirements.txt
Dockerfile
main.py 看起来像这样:
from project.logger import log
if __name__ == '__main__':
<code>
如果我在编辑器 (PyCharm 2024.3) 中运行 main.py,一切正常。但是,如果我将所有内容都放入 Docker 中,我会得到:
Traceback (most recent call last):
File "/project/main.py", line 3, in <module>
from project.logger import log
ModuleNotFoundError: No module named 'project'
我的 Dockerfile 如下所示:
FROM python:3.13-alpine
WORKDIR /project
COPY ./requirements.txt /project/requirements.txt
RUN python -m pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir --upgrade -r /project/requirements.txt
COPY ./checks /project/checks
COPY ./engine /project/engine
COPY ./models /project/models
COPY ./__init__.py /project/__init__.py
COPY ./logger.py /project/logger.py
COPY ./main.py /project/main.py
CMD ["python", "main.py"]
我做错了什么吗?有没有办法强制Python识别模块?
我做错了什么吗?
是的。如果您尝试
import project
,则需要在 Python 搜索路径(包括包含脚本和标准位置的目录)中的某个位置有一个名为 project.py
的文件或名为 project
(包含文件 __init__.py
)的目录就像/usr/lib/python
)。
由于您是从项目目录的内部运行代码,因此该目录本身对于 Python 实际上是不可见的。
代替:
from project.logger import log
改为写:
from logger import log
Python 将在当前目录中找到
logger.py
并按预期工作。
您还可以极大地简化您的
Dockerfile
:
FROM python:3.13-alpine
WORKDIR /project
# Install dependencies
COPY ./requirements.txt ./
RUN python -m pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir --upgrade -r requirements.txt
# Install application code
COPY . ./
CMD ["python", "main.py"]