python-3.x - Python + Docker + 未找到模块
问题描述
我有一个使用 Python 和 Docker 实现的功能。
当我运行时docker-compose up -d
,我能够成功构建映像,并且整个文件夹也被复制到 Docker 容器中,并且我能够在容器中看到复制的文件。
但是,在运行 Python 文件时,我收到了错误
ModuleNotFoundError: No module named "bank_transactions"
在文件 main_transactions.py 中,我已经导入了常量文件,我在下面的屏幕截图中显示了文件夹结构。
当我通过 PyCharm 运行应用程序时,它运行良好,没有任何问题。
以下是 Docker 文件配置。
码头工人-compose.yml
version: "3.6"
services:
app :
build: .
db:
image: postgres
restart: always
environment:
POSTGRES_USERNAME: root
POSTGRES_PASSWORD: root
POSTGRES_DB: testdb
ports:
- 5432:5432
Dockerfile
FROM python:3.6
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt
CMD [ "python", "/Transactions/bank_transactions/main_transactions.py" ]
错误日志:
Traceback (most recent call last):
app6_1 | File "/code/bank_transactions/main_transactions.py", line 5, in <module>
app6_1 | from bank_transactions import constants
app6_1 | ModuleNotFoundError: No module named 'bank_transactions'
解决方案
乍一看,您在日志中获得的错误
[…] Traceback(最近一次通话最后一次):
app6_1 | 文件“/code/bank_transactions/main_transactions.py”,第 5 行,在<module>
app6_1 | 从银行交易导入常量
app6_1 | ModuleNotFoundError:没有名为“bank_transactions”的模块
表明该文件main_transactions.py
确实已解析,而该文件又会导入该constants.py
文件,但该文件失败。
实际上,这与import
遍历目录以查找 python 包的方式有关,我很确定您的错误应该通过设置PYTHONPATH
环境变量消失:
FROM python:3.6
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt
ENV PYTHONPATH /code
CMD [ "python", "/code/bank_transactions/main_transactions.py" ]
有关更多详细信息,请参阅另一个 StackOverflow 问题(处理 Python2 - 参见 ImportError 而不是 Python3 的 ModuleNotFoundError - 但修复应该是相同的)。
推荐阅读
- django - Django generic.ListVIew:在同一页面上显示列表项的详细信息(~结合ListView和DetailView)
- docker - 为什么微服务没有在 GKE 上重新启动 - “复制失败:httpReaderSeeker:打开失败:无法获取内容描述符”
- c# - Visual Studio 类图自定义集合关联
- swiper - 在 Swiper JS 中使用下一个/上一个按钮控制幻灯片的数量
- c - 尝试在我的案例陈述中放置我的错误陈述
- android - 'kotlin-android-extensions' 已弃用
- python - 如何按需要打印到 .csv 的列对该列表进行排序
- scala - 在scalatest中,如何在测试结果中显示完全差异?
- javascript - Vue/Nuxt 是否有适当的模式来加载和编辑组件数据而无需生命周期挂钩
- sql - 如何使用持久化和右()执行列更改?