ЗА замовчуванням під час запуску
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