Docker python 无法识别自定义模块

问题描述 投票:0回答:1

我有一个具有以下结构的项目:

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识别模块?

python-3.x docker dockerfile python-module
1个回答
0
投票

我做错了什么吗?

是的。如果您尝试

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"]
© www.soinside.com 2019 - 2024. All rights reserved.