【问题标题】:Setting Docker ENV using python -c "command"使用 python -c "command" 设置 Docker ENV
【发布时间】:2020-07-23 10:43:03
【问题描述】:

我下载的 python 模块位于用户的主目录中。我需要将 python 路径设置为用户的 bin 配置文件。我在 dockerfile 中尝试了如下所示的两种方法,但无济于事。当我在第一种情况下检查运行容器中的环境变量时,PY_USER BIN 是$(python -c 'import site; print(site.USER_BASE + "/bin")'),而对于第二种情况,PY_USER_BIN 是空白的。但是,当我手动尝试导出 PY_USER_BIN 变量时,它可以工作。

ENV PY_USER_BIN $(python -c 'import site; print(site.USER_BASE + "/bin")')

ENV PATH $PY_USER_BIN:$PATH

RUN export PY_USER_BIN=$(python -c 'import site; print(site.USER_BASE + "/bin")')

ENV PATH $PY_USER_BIN:$PATH

【问题讨论】:

  • afaik 你不能在 ENV 语句中使用 shell 命令替换。至于第二种情况,我有类似的问题。我们通过编写自定义启动器/入口点脚本来解决它,该脚本设置所需的环境变量,然后执行实际命令....
  • ...作为旁注,我猜您第二次尝试失败的原因是因为 RUN 实际上在子外壳中执行您的命令(请参阅外壳形式:docs.docker.com/engine/reference/builder/#entrypoint)...所以你真的是执行/bin/sh -c export PY_USER_BIN=...,因此环境变量设置在子shell的上下文中,一旦docker处理以下ENV语句就会丢失......
  • Docker 通常没有“用户”或“主目录”的概念;由于 Docker 映像文件系统与其他所有内容完全隔离,因此通常的做法是将 pip install 依赖项放入“系统”Python(与主机 Python 和其他容器的 Python 隔离)。您可以这样做,并完全跳过设置这些环境变量吗?

标签: python docker dockerfile


【解决方案1】:

对我来说,你混合了不同的执行环境。

您使用的ENV 命令是一个 Dockerfile 命令,它用于 docker 上下文中的 env 变量,它将被转发到容器。

RUN 命令在容器内执行命令,这里是export。容器内所做的一切都留在容器内,docker 将无法访问它。

对我来说,没有必要将 python 在主机上的 docker ENV 变量作为它们不共享相同的文件系统。如果您需要在容器上下文中执行此操作,请使用标准 shell 命令在容器上下文中运行这些命令。

首先尝试通过连接到您的容器并在其中运行一个 shell,一旦命令工作,将它们放入您的 Dockerfile。就这么简单。为此运行它:

docker run -ti [your container name/tag] [your shell]

如果你使用 sh 作为 shell:

docker run -ti [your container name/tag] sh

然后试试你的命令。

在我看来,您想要的命令看起来像这样:

RUN export PY_USER_BIN=$(python -c 'import site; print(site.USER_BASE + "/bin")')
RUN export PATH=$PY_USER_BIN:$PATH

无论如何,容器的意义在于拥有固定的文件系统、固定的用户名等等。因此,在 99% 的情况下,USER_BIN 应始终位于容器内的同一路径中,您可以很好地对其进行硬编码。

【讨论】:

  • 谢谢尼古拉斯!我知道当我直接在容器中运行命令时它确实可以手动工作,但是我很想知道是否有办法通过 Dockerfile 来做到这一点。
猜你喜欢
  • 2021-08-23
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多