Подключитесь к контейнеру докеров как пользователь, отличный от 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"