【问题标题】:Docker image and ENV command for PYTHONPATH: module not found even when locally runs finePYTHONPATH 的 Docker 映像和 ENV 命令:即使在本地运行良好也找不到模块
【发布时间】:2018-08-24 15:46:19
【问题描述】:

我有一个 Python 作业,我正试图在 Docker 映像中发布。代码的结构方式是一些模块从modules 文件夹中导入,因此我已将其添加到 Python 路径中。

具体来说,Dockerfile是

FROM python:3

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

ENV PYTHONPATH "/usr/src/app"

RUN pip3 install -r requirements.txt

如您所见,我正在尝试为 PYTHONPATH 设置环境变量,以便它可以在同一工作目录中找到内容。

要运行的脚本称为 main.py,当我在本地(不是从 docker)运行它时,

PYTHONPATH=$PYTHONPATH:$HOME/job-path python3 main.py

它运行良好。

使用该 Dockerfile instesd,在构建映像后,我从 docker inspect <ID> 获得了 Env 字段包含的映像

"Env": [
            "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=C.UTF-8",
            "PYTHON_VERSION=3.6.4",
            "PYTHON_PIP_VERSION=9.0.1",
            "PYTHONPATH=/usr/src/app"
        ]

所以看起来没问题?但是docker run 给了我一个

ModuleNotFoundError: No module named 'modules'

【问题讨论】:

  • 你可以在你的 docker run 命令后面加上-e PYTHONPATH="/usr/src/app" 并再次尝试运行它吗?
  • @SagarRuchandani 完成,也不起作用,结果相同。
  • 不确定容器内发生了什么。这可能是stackoverflow.com/questions/47355844/… 的可能副本吗
  • 您意识到在 dockerfile 中设置 ENV 时您交换了它而不是附加它,对吗?我建议这样做:ENV PYTHONPATH="$PYTHONPATH:/usr/src/app" 而不是
  • 你弄明白了吗?

标签: python docker pythonpath


【解决方案1】:

这里的问题是,您复制到 /usr/src/app 的 src 文件夹中可能没有 __init__.py。这就是无法识别modules 包的原因。您可以将__init__.py 添加到您的 src 文件夹或将 modules 添加到 PYTHONPATH

ENV PYTHONPATH "/usr/src/app/:/usr/src/app/modules/"

请注意,如果您的 modules 文件夹有子文件夹,它也应该包含 __init__.py

【讨论】:

    【解决方案2】:

    语法是

    ENV variable1[=value1] variable2[=value2] ...
    

    如果没有等号,您将创建两个空变量;第二个名字是/usr/src/app。你想要的

    ENV PYTHONPATH="/usr/src/app"
    

    在变量的名称和它的值之间使用等号。

    如果要附加到现有值,可以:

    ENV PYTHONPATH="/usr/src/app:${PYTHONPATH}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多