我有一个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'
这里的问题可能是你的src文件夹中没有__init__.py
你复制到/usr/src/app
。这就是为什么modules
包装不被认可的原因。您可以将__init__.py
添加到您的src文件夹或将modules
添加到PYTHONPATH
ENV PYTHONPATH "/usr/src/app/:/usr/src/app/modules/"
请注意,如果您的modules
文件夹包含子文件夹,则它还应包含__init__.py
语法是
ENV variable1[=value1] variable2[=value2] ...
如果没有等号,您将创建两个空变量;第二个名字是/usr/src/app
。你要
ENV PYTHONPATH="/usr/src/app"
在变量的名称和它的值之间有一个等号。
如果要附加到现有值,您可以:
ENV PYTHONPATH="/usr/src/app:${PYTHONPATH}"