使用python-c设置Docker环境;“命令”;

使用python-c设置Docker环境;“命令”;,python,docker,dockerfile,Python,Docker,Dockerfile,我下载的python模块位于用户的主目录中。我需要将python路径设置为用户的bin配置文件。我在dockerfile中尝试了如下所示的两种方法,但均无效。当我检查运行容器中的环境变量时,对于第一种情况,PY_用户BIN是$(python-c'import site;print(site.USER_BASE+“/BIN”)),对于第二种情况,PY_用户BIN是空的。但是,当我手动尝试导出PY_USER_BIN变量时,它会起作用 ENV PY_USER_BIN$(python-c'import

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

ENV PY_USER_BIN$(python-c'import site;print(site.USER_BASE+“/BIN”)

ENV PATH$PY\u USER\u BIN:$PATH

运行导出PY\u USER\u BIN=$(python-c“导入站点;打印(site.USER\u BASE+“/BIN”))


ENV PATH$PY\u USER\u BIN:$PATH

对我来说,您混合了不同的执行上下文

您使用的
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%的情况下,用户BIN应始终位于容器内的同一路径中,您可以很好地对其进行硬编码。

对我来说,您混合了不同的执行上下文

您使用的
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%的情况下,用户BIN应始终位于容器内的同一路径中,您可以很好地对其进行硬编码。

afaik您不能在ENV语句中使用shell命令替换。至于第二个案例,我也有类似的问题。我们通过编写一个自定义启动程序/入口点脚本来解决这个问题,该脚本设置了所需的环境变量,然后执行实际的命令……作为旁注,我想您第二次尝试失败的原因是因为RUN实际上在子shell中执行您的命令(请参见shell表单:)…因此您实际上是在执行
/bin/sh-c export PY_USER_bin=…
,因此环境变量在子shell的上下文中设置,并且在docker处理以下ENV语句时丢失…docker通常没有“USER”或“home directory”的概念;由于Docker映像文件系统与其他所有文件系统完全隔离,通常的做法是将依赖项安装到“系统”Python中(与主机Python和其他容器的Python隔离)。您可以这样做,并完全跳过设置这些环境变量吗?好的,您不能在ENV语句中使用shell命令替换。至于第二个案例,我也有类似的问题。我们通过编写一个自定义启动程序/入口点脚本来解决这个问题,该脚本设置了所需的环境变量,然后执行实际的命令……作为旁注,我想您第二次尝试失败的原因是因为RUN实际上在子shell中执行您的命令(请参见shell表单:)…因此您实际上是在执行
/bin/sh-c export PY_USER_bin=…
,因此环境变量在子shell的上下文中设置,并且在docker处理以下ENV语句时丢失…docker通常没有“USER”或“home directory”的概念;由于Docker映像文件系统与其他所有文件系统完全隔离,通常的做法是将依赖项安装到“系统”Python中(与主机Python和其他容器的Python隔离)。你能做到这一点,完全跳过设置这些环境变量吗?谢谢你,尼古拉斯!我知道,当我直接在容器中运行命令时,它确实可以手动工作,但是我很好奇,是否有办法通过Dockerfile实现这一点。谢谢Nicolas!我知道,当我直接在容器中运行命令时,它确实可以手动工作,但是我很想知道是否有一种方法可以通过Dockerfile实现这一点。