如何在 Dockerfile 中添加 PYTHONPATH 的路径

Posted

技术标签:

【中文标题】如何在 Dockerfile 中添加 PYTHONPATH 的路径【英文标题】:How do you add a path to PYTHONPATH in a Dockerfile 【发布时间】:2018-09-12 20:14:12 【问题描述】:

如何在 Dockerfile 中添加指向PYTHONPATH 的路径?这样当容器运行时它就有正确的PYTHONPATH?我对 Docker 完全陌生。

我已将 ENV PYTHONPATH "$PYTHONPATH:/control" 添加到 Dockerfile,因为我想将目录 /control 添加到 PYTHONPATH

当我使用docker exec -it trusting_spence bash 访问容器的bash 并打开python 并运行目录下的命令时,control 不在列表中。

import sys print(sys.path)

FROM python:2
RUN pip install requests pymongo

RUN mkdir control

COPY control_file/ /control

ENV PYTHONPATH "$PYTHONPATH:/control"

CMD ["python","control/control_file/job.py"] 

【问题讨论】:

【参考方案1】:

以更简单的方式进行。以这种方式将 .env 文件中的 python 路径添加为一行。

PYTHONPATH=/app/project_source/

【讨论】:

【参考方案2】:

您正确设置了 python 路径,但您的命令不是由 shell 运行的,因此不考虑环境变量 PYTHONPATH

将您的CMD 从“exec”形式更改为“shell”形式:

CMD python control/control_file/job.py


来自Docs:

注意:与 shell 形式不同,exec 形式不调用命令 shell。这意味着不会发生正常的外壳处理。例如,CMD [ "echo", "$HOME" ] 不会对 $HOME 进行变量替换。如果你想要 shell 处理,那么要么使用 shell 形式,要么直接执行 shell,例如:CMD [ "sh", "-c", "echo $HOME" ]。当使用 exec 形式并直接执行 shell 时,与 shell 形式一样,是 shell 进行环境变量扩展,而不是 docker。

【讨论】:

【参考方案3】:

只需在您的Dockerfile 中添加一个ENV 条目:

ENV PYTHONPATH "$PYTHONPATH:/your/custom/path"

或者在你的启动脚本中设置PYTHONPATH

【讨论】:

我尝试了你的建议但没有成功,我已经编辑了我的原始帖子以包含我的步骤。你能建议我做错了什么吗? 您是否尝试过修复字符串中的错字? "$PYTHONPATH:/your/custom/path" 出于某种原因,这仍然只是覆盖我的 PYTHONPATH。此外,虽然这是在修改 ENV 变量,但我根据python -c "import sys; for p in sys.path: print(p)" 的路径仍然没有改变,只包含旧的(似乎被覆盖的)PYTHONPATH,没有任何变化 有人给这家伙一枚奖章。太感谢了。像魅力一样工作。 :)

以上是关于如何在 Dockerfile 中添加 PYTHONPATH 的路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dockerfile 中复制配置文件?

如何使用 Dockerfile自定义镜像?

如何编写 Dockerfile 来运行 Python3 + PyQt5

如何在 Dockerfile for Docker Cloud 中正确初始化 git 子模块

如何使用 python 和 Java 运行 Docker?

在 Dockerfile 中激活 python virtualenv