Подключитесь к контейнеру docker как пользователь, отличный от root

по умолчанию при запуске

docker run -it [myimage]

или

docker attach [mycontainer]

вы подключаетесь к терминалу как пользователь root, но я хотел бы подключиться как другой пользователь. Возможно ли это?

6 ответов


на docker run:

просто добавьте опцию --user <user> для перехода на другого пользователя при запуске контейнера docker.

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)

если вы действительно хотите прикрепиться к пользователю, которого хотите иметь, то

  1. начните с этого пользователя run --user <user> или упомянуть об этом в Dockerfile используя USER
  2. измените пользователя с помощью ' su

вы можете запустить оболочку в работающем контейнере docker с помощью команды:

docker exec -it --user root <container id> /bin/bash


вы можете указать USER в файле Dockerfile. Все последующие действия будут выполняться с использованием этой учетной записи. Вы можете указать USER одна строка перед CMD или ENTRYPOINT Если вы хотите использовать этого пользователя только при запуске контейнера (а не при создании изображения). При запуске контейнера из результирующего изображения вы присоединитесь как указанный пользователь.


единственный способ заставить его работать-это:

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash su - magnus

поэтому я должен указать переменную среды $USER, а также точку файла /etc/passwd. Таким образом, я могу скомпилировать папку /siem и сохранить право собственности на файлы там не как root.


мое решение:

#!/bin/bash
user_cmds="$@"

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 сценарий, показанный выше. The addgroup/useradd machinery позволяет пользователю владеть любыми файлами / каталогами, созданными сборкой.

пока это работает для нас. Это кажется суховато. Я открыт для альтернативных реализаций ...


выполнить команду как www-data user:docker exec -t --user www-data container bash -c "ls -la"