python - 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 有关,关于如何解决这个问题的任何想法?
解决方案
我刚刚在 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"]
推荐阅读
- swift - SwiftUI:您能否为数据本身的变化制作动画,而不仅仅是视图对变化的响应?
- python - 理解其中一种python数据类型有问题
- c# - 通过拆分从多个文本文件或一个文件中搜索网站上出现的特定单词
- azure-cosmosdb - 唯一 ID 是 CosmosDB 的最佳分区键吗
- docker - Portainer:在尝试连接到 Docker 守护进程套接字时获得权限被拒绝
- python - Python Devtools 阻止 selenium click()
- javascript - canvas.fillRect 不在浏览器窗口上显示矩形
- javascript - WebDriverIO - 在 Google Chrome 上运行时出现奇怪的行为
- javascript - 我收到“Firebase 存储:`put` 中的参数计数无效:预期在 1 到 2 个参数之间,收到 0
- c++ - 二叉搜索树中元素的下限值