Docker-compose: 模块未找到错误:没有名为'core'的模块
我在使用 fastapi、docker、docker-compose 和 kafka。
我尝试启动 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-modules 在 docker-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 个回答
这是一个路径的问题。最好的解决办法是修改 $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.py
在 consumers/
目录下,这种情况就不能发生了(除非有帮助)。在 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
中需要的内容,还有很多其他方法可以设置和/或扩展这个环境变量)