Добавить пользователя в Docker Container

158

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

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

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

Изображение My Docker построено на официальной базе Ubuntu14.04.

Вот результат из файла Docker, когда выполняются команды 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] 
Теги:
docker

6 ответов

292
Лучший ответ

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

RUN useradd -ms /bin/bash newuser

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

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

USER newuser
WORKDIR /home/newuser

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

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

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

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

  • 0
    Является ли 'newuser' именем пользователя, которого вы сами выберете?
  • 0
    Да, точно. Замените его на имя по вашему выбору.
Показать ещё 10 комментариев
63

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

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

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

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

RUN adduser -D -g '' newuser

См. Busybox adduser

  • 2
    Спасибо! Похоже, что для высокоуровневого решения adduser предпочтительнее использовать низкоуровневые функции, такие как useradd .
  • 0
    adduser: unrecognized option: gecos Это, похоже, не работает на Alpine.
23

Ubuntu

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

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useradd (см. man useradd):

  • -r, --system Создать системную учетную запись. смотрите: Последствия создания системных учетных записей
  • -m, --create-home Создать домашний каталог пользователя.
  • -d, --home-dir HOME_DIR Домашний каталог новой учетной записи.
  • -s, --shell SHELL Вход в оболочку новой учетной записи.
  • -g, --gid GROUP Имя или идентификатор основной группы.
  • -g, --groups GROUPS Список дополнительных групп.
  • -u, --uid UID Укажите идентификатор пользователя. смотрите: Понимание того, как uid и gid работают в контейнерах Docker
  • -p, --password PASSWORD Зашифрованный пароль новой учетной записи (например, ubuntu).

    Чтобы установить пароль, добавьте: -p "$(openssl passwd -1 ubuntu)" к вышеприведенной команде.

  • 0
    Почему пользователь будет в корневой группе? Разве не весь смысл в том, чтобы в целях безопасности иметь пользователя без полномочий root?
  • 1
    @Novaterata В зависимости от использования. root группа не означает, что у них есть root-доступ, просто у них больше прав на чтение некоторых файлов (например, журналов), что полезно, но это зависит от проекта.
Показать ещё 1 комментарий
2

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

RUN useradd -ms /bin/bash yourNewUserName
  • 12
    немного больше объяснений было бы хорошо ...
0

Добавление пользователя в Docker и запуск вашего приложения под этим пользователем - очень хорошая практика с точки зрения безопасности. Для этого я бы порекомендовал следующие шаги:

FROM node:10-alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

Выше приведен полный пример копирования файлов проекта NodeJS, создания группы пользователей и пользователя, назначения пользователю разрешения для папки проекта, переключения на вновь созданного пользователя и запуска приложения под этим пользователем.

-3

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

(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
Сообщество Overcoder
Наверх
Меню