代码之家  ›  专栏  ›  技术社区  ›  Doug Donohoe

Docker为什么不设置$user环境变量

  •  0
  • Doug Donohoe  · 技术社区  · 7 年前

    我正在做一个简单的Docker构建,其中图像运行一个脚本,假设 $USER 设置,就像它通常在bash shell中一样。

    然而, $用户 使用时未设置 /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
    

    但是,如果在壳里 su -l root 然后 $用户 被设置。

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

    我知道我可以补充 ENV USER=root 到 Dockerfile ,但我试图避免对值进行硬编码。

    有没有人对这可能发生的原因有什么建议?我主要是出于好奇,想知道码头工人动工时发生了什么。 bash . 很明显,它与登录shell和 --login 选项似乎不起作用。

    3 回复  |  直到 7 年前
        1
  •  1
  •   David Maze    7 年前

    The only environment variables documented to be set 是 $HOME , $HOSTNAME , $PATH ,并且(也许) $TERM . (A) docker build RUN STEP在内部的作用相当于 docker run )如果需要设置其他变量,可以使用 ENV 指令。

    通常在Dockerfile中,不需要特别设置路径名或用户名,因为这些路径名或用户名位于与主机分离的独立空间中。例如,将“应用程序”放入 /app 即使这不是标准的fhs路径。它被认为是一个最佳实践,尽管很少这样做,设置一些非根用户来实际运行应用程序并使用 USER 在Dockerfile中的后期指令。在所有这些情况下,您都知道用户名实际上是什么;它不是任何类型的参数。

        2
  •  1
  •   ErikMD    7 年前

    根据 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? :

    没有规则。一些贝壳像 tcsh 或 zsh 设置 零花钱 . ZSH 集合 $用户 .

    它可能是由一些登录您的东西设置的,比如 login (如所调用的 getty 当在终端上登录时,有时通过其他方式 in.rlogind ) cron , su , sudo , sshd , rshd ,图形登录管理器或可能不。

    [艾斯]

    因此,在码头集装箱内的清洁环境中,您可能更愿意依赖 whoami 或 id :

    $ docker run --rm -it ubuntu
    root@7f6191875c62:/# whoami
    root
    root@7f6191875c62:/# id
    uid=0(root) gid=0(root) groups=0(root)
    root@7f6191875c62:/# id -u -n
    root
    
        3
  •  0
  •   tDarkCrystal    7 年前

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

    推荐文章