Docker-compose: 模块未找到错误:没有名为'core'的模块

0 投票
1 回答
59 浏览
提问于 2025-04-14 15:19

我在使用 fastapidockerdocker-composekafka

我尝试启动 modules-consumer

docker-compose up consumer-modules

但是我遇到了 ModuleNotFoundError 错误:

ModuleNotFoundError: No module named 'core'

modules_consumer.py 文件中的导入:

from core import settings

这里的 core 是项目文件夹,而不是库。

Dockerfile 文件:

ENV PYTHONUNBUFFERED 1

COPY . /app
WORKDIR /app
RUN rm -rf .venv/
RUN apt-get update && \
    apt-get install -y locales \
    python-dev-is-python3 libldap2-dev libsasl2-dev libssl-dev \
    libmagic1 && \
    echo ru_RU.UTF-8 UTF-8 >> /etc/locale.gen && \
    locale-gen && \
    python -m pip install --upgrade pip && \
    python -m pip install poetry
RUN poetry config virtualenvs.create false && poetry install --no-root --no-dev

EXPOSE 80

Consumer-modulesdocker-compose.yaml 文件中:

consumer-modules:
    build:
      context: ../app
    volumes:
      - ../app:/app
    depends_on:
      - db
    command: sh -c "python3 consumers/modules_consumer.py"

项目结构:

app/
├─ consumers/
│  ├─ modules_consumer.py
│  ├─ __init__.py
├─ core/
│  ├─ settings.py
│  ├─ __init__.py
├─ Dockerfile
├─ docker-compose.yaml

我在 stackoverflow 上找到了一些类似问题,但没有帮助我解决。

这可能是什么问题呢?

1 个回答

1

这是一个路径的问题。最好的解决办法是修改 $PYTHONPATH 环境变量,这个变量告诉 Python 程序在哪里找它需要的文件。

问题

你提到的目录结构是

/app
├─ core/
│  ├─ settings.py
├─ consumers/
│  ├─ modules_consumer.py

当你运行 docker compose up 时,consumer-modules 服务会执行命令 python3 consumers/modules_consumer.py。这个命令是在容器里的 /app 目录下运行的。

现在,发生的事情是这样的:modules_consumer.py 文件里的代码是从它所在的子目录执行的。如果这个文件在 /app/modules_consumer.py,那么里面的代码 from core import settings 就能正常运行。Python 程序会在所有直接的子目录(core/consumers/)中查找 settings.py,并且会在 core/ 找到它。

但是,由于 modules_consumer.pyconsumers/ 目录下,这种情况就不能发生了(除非有帮助)。在 consumers/ 中找不到名为 core.py 的文件后,Python 程序会去查找 consumers/ 中的任何子目录,但不会找到。

解决方案

解决这个问题的方法是将 /app 添加到 $PYTHONPATH 环境变量中。这样,Python 程序就会知道除了当前目录外,还要在 /app 中查找导入的文件。

我觉得在你的情况下,最简单的做法是在你的 docker-compose.yml 文件中覆盖这个变量:

consumer-modules:
    build:
      context: ../app
    volumes:
      - ../app:/app
    depends_on:
      - db
    environment:
      - PYTHONPATH=/app
    command: sh -c "python3 consumers/modules_consumer.py"

(如果发现这变得更复杂,比如因为这个覆盖了一些默认情况下已经在 $PYTHONPATH 中需要的内容,还有很多其他方法可以设置和/或扩展这个环境变量)

撰写回答