首页 > 解决方案 > Docker 容器中的 ModuleNotFoundError 和导入错误

问题描述

在本地导入 python 模块时,我能够成功地做到这一点,但是在对应用程序进行 dockerising 时我很难做到这一点。似乎我在本地得到了与我进入 docker 应用程序相反的行为......有什么想法吗?

我有以下目录结构

| app
|      |api.py
|      |settings.py
| tests
|      |test_api.py

在 api.py 中,我通过以下方式导入设置: from app import settings 在 test_api.py 中,我通过以下方式导入 app.py from app import api:。

在本地,一切正常。当我尝试使用以下 Dockerfile 对这个 API 进行 dockerize 时:

FROM python:3.8.5-alpine

RUN pip install pipenv
COPY Pipfile /usr/src/
WORKDIR /usr/src
RUN pipenv lock --requirements > requirements.txt
RUN pip install -r requirements.txt

COPY app /usr/src/app

WORKDIR /usr/src/app

CMD ["python", "api.py"]

docker 镜像构建成功,但是在运行容器时,我收到以下错误:

File "api.py", line 4, in <module>
from app import settings
ModuleNotFoundError: No module named 'app'

如果我将 api.py 中的导入方式更改为import settings,我会在本地收到错误,但 docker 容器可以正常工作。我很确定这与 PythonPath 有关,关于如何解决这个问题的任何想法?

标签: pythondockerdockerfile

解决方案


我刚刚在 StackOverflow 上遇到了另一个线程,似乎已经解决了我的问题。我可以按照上面在我的问题中指出的那样保留导入语句,并且通过正确设置 docker 容器中的 PYTHONPATH,我可以让导入在 docker 中正常工作。

如何在 Dockerfile 中添加 PYTHONPATH 的路径

我更新(工作)的 Dockerfile 如下:

FROM python:3.8.5-alpine

RUN pip install pipenv
COPY Pipfile /usr/src/
WORKDIR /usr/src
RUN pipenv lock --requirements > requirements.txt
RUN pip install -r requirements.txt

COPY app /usr/src/app

ENV PYTHONPATH "${PYTHONPATH}:/usr/src/app"

CMD ["python", "app/api.py"]

推荐阅读