Docker, почему не установлена ​​переменная окружения $ USER - PullRequest
0 голосов
/ 29 января 2019

Я делаю простую сборку докера, где изображение запускает скрипт, который предполагает, что $USER установлено, как обычно в оболочке bash.

Однако $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.Это явно не похоже на оболочку входа в систему, и опция --login, похоже, не работает.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Единственными документально подтвержденными переменными среды, которые должны быть установлены , являются $HOME, $HOSTNAME, $PATH и (возможно) $TERM.(Внутренний шаг docker build RUN эквивалентен docker run.) Если вам нужны другие переменные, вы можете использовать директиву ENV.

Как правило, в файле Docker нет особой необходимости делатьимена путей или имена пользователей настраиваются, так как они находятся в изолированном пространстве отдельно от хоста.Например, очень распространено помещать «приложение» в /app, даже если это не стандартный путь FHS.Рекомендуется, хотя это и делается нечасто, настраивать некорневого пользователя для фактического запуска приложения и использования директивы USER в конце Dockerfile.Во всех этих случаях вы знаете, что такое имя пользователя;это не какой-либо параметр.

0 голосов
/ 29 января 2019

Попробуйте запустить "/ bin / bash -i", который запустит интерактивный режим, и запустите .profile, где обычно хранятся переменные среды.

0 голосов
/ 29 января 2019

Согласно https://www.tldp.org/LDP/abs/html/internalvariables.html:

Переменные $ENV, $LOGNAME, $MAIL, $TERM, $USER и $USERNAME не являются встроенными в Bash.Однако они часто задаются в качестве переменных среды в одном из файлов запуска Bash или входа в систему.

Также, как указано в этом ответе Unix & Linux SE Кто устанавливает переменные среды $ USER и $ USERNAME? :

Правил нет.Некоторые оболочки вроде tcsh или zsh set $LOGNAME.zsh устанавливает $USER.

Это может быть установлено некоторыми вещами, которые регистрируют вас, например login (как вызывается getty при входе в систему через терминал, а иногда другими вещами, такими как in.rlogind), cron, su, sudo, sshd, rshd, графические менеджеры входа или не могут.

[…]

Так вВ контексте чистой среды в контейнере Docker вы можете предпочесть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...