Підключитися до контейнера докера як користувач, відмінний від root


84

ЗА замовчуванням під час запуску

docker run -it [myimage]

АБО

docker attach [mycontainer]

Ви підключаєтеся до терміналу як користувач root, але я хотів би підключитися як інший користувач. Чи можливо це?


3
Так. docker run --user user_name
Xiongbing Jin

1
Немає такого варіанту кріплення. Вам доведеться увійти як root, а потімsu user_name
Xiongbing Jin 01.03.16

Відповіді:


93

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


Не працював «як є», але скерував мене до робочого рішення. Дякую!
Йозеф Шабл

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Техніка дозволяє користувачеві володіння будь-яких файлів / каталогів , створених збірки.

Поки це працює для нас. Це здається наче хакі. Я відкритий до альтернативних реалізацій ...



0

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

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

В .env:

UID=1000


0

Це вирішило мій випадок використання, який полягає в тому, що: "Скомпілюйте матеріали веб-пакета в контейнері 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 . Дякую!

Також цей матеріал допоміг мені зрозуміти, що відбувається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.