Python 3.x Python+;Docker&x2B;找不到模块
我有一个使用Python和Docker实现的功能 当我运行Python 3.x Python+;Docker&x2B;找不到模块,python-3.x,docker,dockerfile,Python 3.x,Docker,Dockerfile,我有一个使用Python和Docker实现的功能 当我运行docker compose up-d时,我能够成功构建映像,并且整个文件夹被复制到docker容器中,并且我能够看到容器中复制的文件 但是,在运行Python文件时,我发现了错误 ModuleNotFoundError:没有名为“银行交易”的模块 在文件main_transactions.py中,我导入了常量文件,在下面的屏幕截图中显示了文件夹结构 当我通过PyCharm运行应用程序时,它运行得非常完美,没有任何问题 下面是Docke
docker compose up-d
时,我能够成功构建映像,并且整个文件夹被复制到docker容器中,并且我能够看到容器中复制的文件
但是,在运行Python文件时,我发现了错误
ModuleNotFoundError:没有名为“银行交易”的模块
在文件main_transactions.py中,我导入了常量文件,在下面的屏幕截图中显示了文件夹结构
当我通过PyCharm运行应用程序时,它运行得非常完美,没有任何问题
下面是Docker文件的配置
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'
回溯(最近一次呼叫最后一次):
app6_1|文件“/code/bank_transactions/main_transactions.py”,第5行,在
app6_1|来自银行交易导入常量
app6_1 | ModuleNotFoundError:没有名为“bank_transactions”的模块
乍一看,您在日志中获得的错误
[…]回溯(最近一次呼叫上次):app6_1|文件“/code/bank_transactions/main_transactions.py”,第5行,在
app6_1|从银行交易导入常量
app6_1 | ModuleNotFoundError:没有名为“bank_transactions”的模块 建议确实解析了文件
main\u 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" ]
有关更多详细信息,请参见(其中涉及Python2)− 参见ImportError,而不是Python3的ModuleNotFoundError− 但是修复程序应该是相同的。第一条注释:不需要行
RUN mkdir/code
,您可以删除它(因为WORKDIR/code
可以被看作是bash命令的Dockerfile等价物“mkdir-p/code&&cd/code
”),然后,问题可能来自路径问题:如果您执行WORKDIR/code
和复制/code
,而bank_transactions位于docker上下文的根文件夹中(大致是包含docker文件的文件夹),那么您可以尝试CMD[“python”,“/code/back_transactions/main_transactions.py”]
?感谢您的回复,我删除了“RUN mkdir/code”,并添加了CMD[“python”,“/code/back_transactions/main_transactions.py”],并构建新映像并运行它,我得到的错误与ModuleNotFoundError相同:没有名为“bank_transactions”的模块确定(顺便说一句,我的评论中有一个输入错误,我写了“back_”…)但是我想你应该在你的问题中添加更多的细节,也许是docker compose logs的输出的一部分?非常感谢,我能够在docker中执行代码,我正在试图理解为什么python django应用程序没有出现这个问题,我有多个模块导入,图像是用同一个docker创建的文件并成功运行。此答案正确回答了问题。唯一需要更改的是在复制
步骤中添加/
,以便在构建Docker映像时,安装要求不会出错,例如复制./code/
@Martin”如果是目录,复制目录的全部内容;如果是任何其他类型的文件,则会将其与其元数据一起单独复制。在这种情况下,如果以尾部斜杠/结尾,则将其视为目录[…]“因此给定=
是一个目录,尾随斜杠似乎是可选的……但不可否认,添加尾随斜杠不会造成任何伤害,因此我将附加此项以防万一:)@ErikMD感谢您的解释!这是有道理的,并且回答了我在尝试构建映像时在运行
步骤中遇到此错误的原因:错误:无法打开需求文件:[Errno 2]没有这样的文件或目录:'/requirements.txt'
。我假设这是因为(类似于@Suri)我正在复制的文件包含目录和requirements.txt
文件(在这些目录之外),这可能需要尾部的/
才能成功构建。