我正在尝试编写一个小的docker文件,用于设置用户并只回显当前用户作为一个小例子来向自己证明它正在工作。我尝试了很多变种,但在文档中找不到太多帮助。
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"
我在dockerfile上运行docker build .
,然后运行docker run <image-id>
并获得结果
预期结果为daemon
,或者没有USER daemon
行,我希望root
。可能是一个非常简单的答案。
答案 0 :(得分:12)
这是预期的行为,看起来很奇怪!
当ENTRYPOINT
是一个列表(如ENTRYPOINT ["echo", "$USER"]
)时,它按原样使用,无需进一步解析或解释。因此$USER
仍然是$USER
,因为在流程中没有涉及用USER
环境变量的值替换它的shell。
现在,当ENTRYPOINT
是一个字符串(如ENTRYPOINT echo $USER
)时,实际执行的是sh -c "echo $USER"
,$USER
将替换为环境变量的值(正如你所料)。
但是,默认情况下未设置环境变量USER
。它由登录过程设置;当你只运行sh -c ...
时,不涉及登录过程。
在运行docker run -t -i ubuntu bash
和docker run -t -i ubuntu login -f root
时比较环境。在前一种情况下,您将获得一个非常基本的环境;在后一种情况下,您将获得您习惯的完整环境(包括USER
变量)。
答案 1 :(得分:3)
无法在Dockerfile中将ENV
命令设置为默认值,然后在运行容器时,使用-e, --env
字典覆盖将由的:
ENTRYPOINT echo $SOMEENVVAR
形式的ENTRYPOINT?
答案 2 :(得分:2)
我认为这里有一系列问题。
当我
docker run -i -t ubuntu /bin/bash
echo $USER
set
我根本看不到$ USER设置 - 然后whoami会报告守护进程。
另外,我怀疑(但尚未查看代码)Dockerfile中的ENV变量被转义,以避免使用它们(许多人认为它们可以将主变量导出到构建的容器中,但这是码头工人想要避免的东西)