Python 3.x Python+;Docker&x2B;找不到模块

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

我有一个使用Python和Docker实现的功能

当我运行
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
文件(在这些目录之外),这可能需要尾部的
/
才能成功构建。