Docker 容器中的 ModuleNotFoundError 和导入错误

Ani*_*tel 6 python docker dockerfile

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

我有以下目录结构

| app
|      |api.py
|      |settings.py
| tests
|      |test_api.py
Run Code Online (Sandbox Code Playgroud)

在 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"]
Run Code Online (Sandbox Code Playgroud)

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

File "api.py", line 4, in <module>
from app import settings
ModuleNotFoundError: No module named 'app'
Run Code Online (Sandbox Code Playgroud)

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

Ani*_*tel 8

我刚刚在 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"]
Run Code Online (Sandbox Code Playgroud)


小智 1

您的工作目录是 /usr/src/app 并且 import 语句尝试查找目录“app”。如果将工作目录更改为 /usr/src/。

或者,您可以通过以下方式直接导入设置:

import settings
Run Code Online (Sandbox Code Playgroud)

代替

from app import settings
Run Code Online (Sandbox Code Playgroud)