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

85

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

docker run -it [myimage]

ИЛИ ЖЕ

docker attach [mycontainer]

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

Энди59469
источник
3
Да. docker run --user user_name
Xiongbing Jin 01
1
Такого варианта прикрепления нет. Вам нужно будет войти в систему как root, а затемsu user_name
Xiongbing Jin 01

Ответы:

94

Для 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)

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

  1. начните с этого пользователя run --user <user>или упомяните его при DockerfileиспользованииUSER
  2. изменить пользователя с помощью `su
Ларри Кай
источник
72

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

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

Джейсон
источник
2
root - пользователь по умолчанию. --userЯ полагаю, что опция может быть опущена, когда команды должны запускаться от имени root.
Stphane
8
@Stphane, это не всегда так, поскольку пользователя по умолчанию можно настроить в Dockerfile с помощью USERинструкции, см. Docs.docker.com/engine/reference/builder/#user
ryenus
5

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

Клив
источник
Также никогда не забывайте устанавливать HOME
karthik101
2

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

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

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

собственное поле
источник
Не работал «как есть», но направил меня к рабочему решению. Спасибо!
Josef Sábl
1

Мое решение:

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

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

rmccabe3701
источник
0

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

Василий Паскаль
источник
0

Для docker-compose. В docker-compose.yml:

version: '3'
services:
    app:
        image: ...
        user: ${UID:-0}
...

В .env:

UID=1000
x-yuri
источник
0

В качестве обновленного ответа от 2020. --user опция -u - это имя пользователя или UID (формат: <name | uid> [: <group | gid>]).

Тогда у меня это работает так,

docker exec -it -u root:root container /bin/bash

Ссылка: https://docs.docker.com/engine/reference/commandline/exec/

Нурхун
источник
0

Это решило мой вариант использования: «Скомпилируйте материал webpack в контейнере nodejs в Windows, на котором запущен Docker Desktop с WSL2, и создайте ресурсы под вашим текущим авторизованным пользователем».

docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'

На основании ответа eigenfield . Спасибо!

Также этот материал помог мне понять, что происходит.

Йозеф Сабль
источник