Подключитесь к контейнеру докеров как пользователь, отличный от root
По умолчанию при запуске
docker run -it [myimage]
ИЛИ
docker attach [mycontainer]
вы подключаетесь к терминалу как пользователь root, но я хотел бы подключиться как другой пользователь. Это возможно?
Ответы
Ответ 1
Для docker run
:
Просто добавьте опцию --user <user>
, чтобы перейти к другому пользователю при запуске контейнера докеров.
docker run -it --user nobody busybox
Для docker attach
или docker exec
:
Так как команда используется для присоединения/выполнения в существующий процесс, поэтому он напрямую использует текущего пользователя.
docker run -it busybox # CTRL-P/Q to quit
docker attach <container id> # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>
/ $ id
uid=99(nobody) gid=99(nogroup)
Если вы действительно хотите подключиться к пользователю, которого хотите иметь, то
- начните с этого пользователя
run --user <user>
или укажите его в Dockerfile
с помощью USER
- измените пользователя, используя `su
Ответ 2
Вы можете запустить оболочку в запущенном контейнере докеров, используя следующую команду:
docker exec -it --user root <container id> /bin/bash
Ответ 3
Вы можете указать USER
в файле Docker. Все последующие действия будут выполняться с использованием этой учетной записи. Вы можете указать USER
одну строку перед CMD
или ENTRYPOINT
, если вы хотите использовать этого пользователя только при запуске контейнера (а не при создании изображения). Когда вы запускаете контейнер из результирующего изображения, вы будете прикрепляться как указанный пользователь.
Ответ 4
Единственный способ заставить это работать:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v 'pwd':/siem mono bash
su - magnus
Поэтому я должен указать переменную среды $ USER и указать файл /etc/passwd. Таким образом, я могу скомпилировать в папку /siem и сохранить права владения файлами там, а не как root.
Ответ 5
Мое решение:
#!/bin/bash
user_cmds="[email protected]"
GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT
trap "rm -rf $RUN_SCRIPT" EXIT
docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"
Это позволяет пользователю запускать произвольные команды с помощью инструментов, предоставляемых my-docker-image
. Обратите внимание, как текущая рабочая папка пользователя является томом, смонтированным в /cmd
внутри контейнера.
Я использую этот рабочий процесс, чтобы позволить моей команде разработчиков кросс-компилировать код C/C++ для цели arm64, чей bsp я поддерживаю (my-docker-image
содержит кросс-компилятор, sysroot, make, cmake и т.д.). При этом пользователь может просто сделать что-то вроде:
cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"
Где cross_compile.sh
- скрипт, показанный выше. Механизм addgroup/useradd
позволяет пользователю владеть всеми файлами/каталогами, созданными при сборке.
Пока это работает для нас. Кажется, что-то хакерское. Я открыт для альтернативных реализаций...
Ответ 6
Выполните команду как пользователь www-data: docker exec -t --user www-data container bash -c "ls -la"