我正在做一个简单的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
选项似乎不起作用。
答案 0 :(得分:1)
根据https://www.tldp.org/LDP/abs/html/internalvariables.html:
变量
$ENV
,$LOGNAME
,$TERM
,$USER
和$USERNAME
不是Bash内置函数。但是,这些通常在Bash或登录启动文件之一中设置为环境变量。
同样在Unix&Linux SE的答案Who sets $USER and $USERNAME environment variables?中指出:
没有规则。诸如
tcsh
或zsh
之类的某些外壳设置为$LOGNAME
。zsh
设置了$USER
。可能由登录
login
的某些事物(在终端登录时由getty
调用,有时由in.rlogind
之类的其他事物)设置,{{1 }},cron
,su
,sudo
,sshd
,图形登录管理器。[…]
因此,在Docker容器内干净的环境中,您可能希望依靠rshd
或whoami
:
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。