PYTHONPATH的Docker镜像和ENV命令:即使本地运行正常,也找不到模块

问题描述 投票:1回答:2

我有一个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,在构建了我从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'
python docker pythonpath
2个回答
0
投票

这里的问题可能是你的src文件夹中没有__init__.py你复制到/usr/src/app。这就是为什么modules包装不被认可的原因。您可以将__init__.py添加到您的src文件夹或将modules添加到PYTHONPATH

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

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


0
投票

语法是

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

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

ENV PYTHONPATH="/usr/src/app"

在变量的名称和它的值之间有一个等号。

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

ENV PYTHONPATH="/usr/src/app:${PYTHONPATH}"
© www.soinside.com 2019 - 2024. All rights reserved.