15

我正在尝试编写一个设置用户的小 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"

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

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

4

3 回答 3

18

这是预期的行为,看起来很奇怪!

ENTRYPOINT是一个列表(如 中ENTRYPOINT ["echo", "$USER"]),它按原样使用,无需进一步解析或解释。所以$USER仍然存在$USER,因为过程中不涉及使用USER环境变量的值替换它的 shell。

现在,whenENTRYPOINT是一个字符串(如 中ENTRYPOINT echo $USER),实际执行的是sh -c "echo $USER", 并$USER替换为环境变量的值(如您所料)。

USER但是,默认情况下未设置环境变量。由登录进程设置;并且当您只是运行sh -c ...登录过程时不涉及。

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

于 2013-11-11T14:39:47.317 回答
3

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

ENTRYPOINT echo $SOMEENVVAR

入口点的形式?

于 2014-09-11T08:45:43.543 回答
2

我认为这里有一系列问题。

当我

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

我根本没有看到 $USER 设置 - whoami 确实报告了守护进程。

此外,我怀疑(但还没有查看代码)Dockerfile 中的 ENV 变量被转义,以避免使用它们(许多人认为他们可以将主机变量导出到构建的容器,但这是码头工人想避免)

于 2013-11-11T13:11:49.127 回答