【问题标题】:Python + Docker + No module foundPython + Docker + 未找到模块
【发布时间】:2020-11-10 21:26:33
【问题描述】:

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

当我运行docker-compose up -d 时,我能够成功构建映像,并且整个文件夹也被复制到 Docker 容器中,并且我能够在容器中看到复制的文件。

但是,在运行 Python 文件时,我收到了错误

ModuleNotFoundError: No module named "bank_transactions"

在 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'

【问题讨论】:

  • 第一条评论:RUN mkdir /code这行是不需要的,你可以删除它(因为WORKDIR /code可以被看作是bash命令“mkdir -p /code &amp;&amp; cd /code”的Dockerfile等价物)
  • 那么,问题可能来自路径问题:如果你这样做WORKDIR /codeCOPY . /code bank_transactions 在 docker 上下文的根文件夹中(大致,包含 Dockerfile 的文件夹),那么您可以尝试 CMD ["python", "/code/back_transactions/main_transactions.py"]?
  • 感谢您的回复,我已经删除了 "RUN mkdir /code" 并添加了 CMD ["python", "/code/back_transactions/main_transactions.py"] ,并建立了新的图像和运行它,我得到与 ModuleNotFoundError 相同的错误:没有名为“bank_transactions”的模块
  • 好的(顺便说一句,我的评论中有错字,我写了“back_”......)但我想你应该在你的问题中添加更多细节,也许是@987654333 输出的一部分@?

标签: python-3.x docker dockerfile


【解决方案1】:

乍一看,你在日志中得到的错误

[…] Traceback(最近一次通话最后一次):
app6_1 |文件“/code/bank_transactions/main_transactions.py”,第 5 行,&lt;module&gt;
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" ]

有关更多详细信息,请参阅this other StackOverflow question(处理 Python2 - 参见 ImportError 而不是 Python3 的 ModuleNotFoundError - 但修复应该相同)。

【讨论】:

  • 非常感谢,我能够在 docker 中执行代码,我试图理解为什么 python django 应用程序没有给出问题,其中我有多个模块导入并且图像是用同一个 docker 创建的文件并成功运行。
  • 这个答案正确回答了这个问题。唯一需要更改的是在COPY 步骤中添加/,以便在构建Docker 映像时安装要求运行时不会出错,例如COPY . /code/.
  • @Martin according to the doc "如果 是目录,则复制目录的全部内容;如果 是任何其他类型的文件,则将其连同其元数据单独复制. 在这种情况下,如果 以斜杠 / 结尾,它将被视为目录 […]”,因此鉴于 =. 是一个目录,斜杠似乎是可选的…但不可否认,添加尾部斜杠不会造成任何伤害,所以我会附加它以防万一:)
  • @ErikMD 感谢您的解释!这是有道理的,并回答了为什么我在尝试构建映像时在RUN 步骤中遇到此错误:ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/requirements.txt'。我假设这是因为(类似于@Suri)我正在复制的 包含目录 requirements.txt 文件(在这些目录之外),这可能需要尾随 @987654336 @为了构建成功。
猜你喜欢
  • 2018-10-30
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多