Подключитесь к контейнеру 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)
если вы действительно хотите прикрепиться к пользователю, которого хотите иметь, то
- начните с этого пользователя
run --user <user>
или упомянуть об этом вDockerfile
используяUSER
- измените пользователя с помощью ' 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 позволяет пользователю владеть любыми файлами / каталогами, созданными сборкой.
пока это работает для нас. Это кажется суховато. Я открыт для альтернативных реализаций ...