Добавить пользователя в контейнер Docker

у меня есть контейнер docker с некоторыми процессами (uwsgi и сельдерей), запущенными внутри. Я хочу создать пользователя сельдерея и пользователя uwsgi для этих процессов, а также рабочую группу, к которой они оба будут принадлежать, чтобы назначить разрешения.

Я пробовал добавлять RUN adduser uwsgi и RUN adduser celery в мой Dockerfile, но это вызывает проблемы, так как эти команды запрашивают ввод (я опубликовал ответы из сборки ниже).

каков наилучший способ добавить пользователей в Контейнер Docker, чтобы установить разрешения для рабочих, работающих в контейнере?

мое изображение Докера построено из официального Ubuntu14.04 база.

вот вывод из файла Dockerfile при выполнении команд adduser:

Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ... 
Adding new user `uwsgi' (1000) with group `uwsgi' ... 
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
    Full Name []: 
Room Number []:     Work Phone []:  Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 
---> 258f2f2f13df 
Removing intermediate container 59948863162a 
Step 5 : RUN adduser celery 
---> Running in be06f1e20f64 
Adding user `celery' ...
Adding new group `celery' (1001) ... 
Adding new user `celery' (1001) with group `celery' ... 
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for celery
Enter the new value, or press ENTER for the default
    Full Name []:   Room Number []:     Work Phone []: 
Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 

5 ответов


фокус в том, чтобы использовать useradd вместо интерактивной оболочки adduser. Обычно я создаю пользователей с помощью:

RUN useradd -ms /bin/bash newuser

который создает домашний каталог для пользователя и гарантирует, что bash является оболочкой по умолчанию.

вы можете добавить:

USER newuser
WORKDIR /home/newuser

к вашему dockerfile. Каждая команда после этого, а также интерактивные сеансы будут выполняться как user newuser:

docker run -t -i image
newuser@131b7ad86360:~$

возможно, вам придется дать newuser разрешения на выполнение программы, которые вы собираетесь запускать перед вызовом команды user.

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


чтобы избежать интерактивных вопросов adduser, вы можете вызвать его с помощью следующих параметров:

RUN adduser --disabled-password --gecos '' newuser

на --gecos параметр используется для установки дополнительной информации. В этом случае она просто пуста.

в системах с busybox (например, Alpine) используйте

RUN adduser -D -g '' newuser

посмотреть busybox adduser


Ubuntu

попробуйте следующие строки в Dockerfile:

RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useradd "параметры" (см.: man useradd):

  • -d, --home-dir HOME_DIR домашний каталог новой учетной записи.
  • -m, --create-home создайте домашний каталог пользователя.
  • -s, --shell SHELL оболочка входа в новую учетную запись.
  • -g, --gid GROUP имя или идентификатор основной группы.
  • -G, --groups GROUPS список доп группы.
  • -p, --password PASSWORD зашифрованный пароль новой учетной записи (например,ubuntu).

добавьте эту строку в файл Dockerfile (вы можете запустить любую команду linux таким образом)

RUN useradd -ms /bin/bash yourNewUserName

Это еще один пример (если у вас есть какой-то сетевой каталог active)

(sudo groups || groups) | grep docker || echo 'Could not find docker group, consider: groupadd docker; gpasswd -a ${USER} docker; service docker.io restart; service docker restart; newgrp docker; nscd -i group'

и просто создание пользователя с некоторыми полезными группами

useradd -g cdrom,floppy,audio,dip,video,plugdev,netdev,lpadmin,scanner,bluetooth,docker --create-home --shell $SHELL gitlabuser