ЗА замовчуванням під час запуску
docker run -it [myimage]
АБО
docker attach [mycontainer]
Ви підключаєтеся до терміналу як користувач root, але я хотів би підключитися як інший користувач. Чи можливо це?
ЗА замовчуванням під час запуску
docker run -it [myimage]
АБО
docker attach [mycontainer]
Ви підключаєтеся до терміналу як користувач root, але я хотів би підключитися як інший користувач. Чи можливо це?
su user_name
Відповіді:
Для 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Ви можете запустити оболонку в запущеному контейнері докера, використовуючи таку команду, як:
docker exec -it --user root <container id> /bin/bash
--userПараметр можна опустити, коли команди, як я вважаю, повинні виконуватися як root.
USERінструкції, див. Docs.docker.com/engine/reference/builder/#user
Ви можете вказати 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сценарій, показаний вище. addgroup/useraddТехніка дозволяє користувачеві володіння будь-яких файлів / каталогів , створених збірки.
Поки це працює для нас. Це здається наче хакі. Я відкритий до альтернативних реалізацій ...
Виконати команду як користувач www-даних: docker exec -t --user www-data container bash -c "ls -la"
Оновленою відповіддю з 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/
Це вирішило мій випадок використання, який полягає в тому, що: "Скомпілюйте матеріали веб-пакета в контейнері 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 . Дякую!
Також цей матеріал допоміг мені зрозуміти, що відбувається.
docker run --user user_name