Docker为什么未设置$ USER环境变量

时间:2019-01-28 22:28:34

标签: bash docker ubuntu

我正在做一个简单的docker build,其中映像运行一个脚本,该脚本假定设置了$USER,就像通常在bash shell中一样。

但是,使用$USER/bin/bash时未设置/bin/bash --login。使用最新的ubuntu

非常容易演示
$ docker run -t -i ubuntu:latest
root@1dbeaefd6cd4:/# echo $USER

root@1dbeaefd6cd4:/# exit

$ docker run -t -i ubuntu:latest /bin/bash --login
root@d2728a8188a5:/# echo $USER

root@1dbeaefd6cd4:/# exit

但是,如果在外壳程序I su -l root中,则设置$USER

root@d2728a8188a5:/# su -l root
root@d2728a8188a5:~# echo $USER
root
root@d2728a8188a5:~# exit

我知道可以将ENV USER=root添加到Dockerfile中,但是我试图避免对值进行硬编码。

有人建议为什么会发生这种情况吗?我主要是出于好奇,要求了解Docker启动bash时发生的情况。显然,它与登录shell并不完全一样,并且--login选项似乎不起作用。

3 个答案:

答案 0 :(得分:1)

根据https://www.tldp.org/LDP/abs/html/internalvariables.html

  

变量$ENV$LOGNAME$MAIL$TERM$USER$USERNAME不是Bash内置函数。但是,这些通常在Bash或登录启动文件之一中设置为环境变量。

同样在Unix&Linux SE的答案Who sets $USER and $USERNAME environment variables?中指出:

  

没有规则。诸如tcshzsh之类的某些外壳设置为$LOGNAMEzsh设置了$USER

     

可能由登录login的某些事物(在终端登录时由getty调用,有时由in.rlogind之类的其他事物)设置,{{1 }},cronsusudosshd,图形登录管理器。

     

[…]

因此,在Docker容器内干净的环境中,您可能希望依靠rshdwhoami

id

答案 1 :(得分:1)

The only environment variables documented to be set$HOME$HOSTNAME$PATH和(也许是)$TERM。 (内部的docker build RUN步骤等效于docker run。)如果需要设置其他变量,则可以使用ENV指令。

通常,在Dockerfile中,不需要特别配置路径名或用户名,因为它们位于与主机分离的隔离空间中。例如,即使不是标准的FHS路径,将“应用程序”放在/app中也非常普遍。尽管不常这样做,但最好的做法是设置一些非root用户来实际运行应用程序,并在Dockerfile中后期使用USER指令。在所有这些情况下,您都知道用户名实际上是什么;这不是任何参数。

答案 2 :(得分:0)

尝试运行“ / bin / bash -i”,这将强制进行交互模式并执行通常用于存储环境变量的.profile。