Docker的echo环境variables

我试图写一个小docker文件,设置一个用户,只是回声当前用户作为一个小例子certificate自己它正在工作。 我已经尝试了一些变体,在文档中找不到太多的帮助。

FROM ubuntu USER daemon # ENTRYPOINT ["echo", "$USER"] # just gives "$USER" # ENTRYPOINT ["echo", "-e", "${USER}"] # just gives "$USER" # ENTRYPOINT echo $USER # gives empty string # ENTRYPOINT ["/bin/echo", "$USER"] # just gives "$USER" 

我正在运行docker build . 在dockerfile上,然后运行docker docker run <image-id>并获取结果

预期的结果是daemon ,或者没有USER daemon行,我期望root 。 可能是一个非常简单的答案。

这是预料之中的行为,就像看起来那样奇怪!

ENTRYPOINT是一个列表(如ENTRYPOINT ["echo", "$USER"] )时,它是按原样使用的,不需要进一步parsing或解释。 因此, $USER仍然是$USER ,因为在进程中没有涉及用USER环境variables的值replace它的shell。

现在,当ENTRYPOINT是一个string(如在ENTRYPOINT echo $USER )时,实际执行的是sh -c "echo $USER"$USER被replace为环境variables的值(如你所期望的那样)。

但是,默认情况下不设置环境variablesUSER 。 它由login过程设置; 而当你只是运行sh -c ...login过程不涉及。

运行docker run -t -i ubuntu bashdocker run -t -i ubuntu login -f root时比较环境。 在前一种情况下,你会得到一个非常基本的环境; 在后一种情况下,您将得到您习惯的完整环境(包括USERvariables)。

我想这里有一系列的问题。

当我

 docker run -i -t ubuntu /bin/bash echo $USER set 

我没有看到$ USER被设置,但是whoami却报告守护进程。

此外,我有怀疑(但还没有看过代码),在Dockerfile的ENVvariables逃脱,以避免它们的使用(许多人认为他们可以将主机variables导出到构build的容器,但这是docker工人想避免)

不能在Dockerfile中将ENV命令设置为默认值,然后在运行容器时使用-e, --env字典来覆盖将由以下内容解释的内容:

 ENTRYPOINT echo $SOMEENVVAR 

进入forms?