it-roy-ru.com

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

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

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

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

Мой образ 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] 
173
rfj001

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

RUN useradd -ms /bin/bash newuser

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

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

USER newuser
WORKDIR /home/newuser

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

docker run -t -i image
[email protected]:~$

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

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

319
Paul Staab

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

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

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

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

RUN adduser -D -g '' newuser

Смотрите Занятый adduser

67
Raffael

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 Login Shell новой учетной записи.
  • -g, --gid GROUP Имя или идентификатор основной группы.
  • -G, --groups GROUPS Список дополнительных групп.
  • -u, --uid UID Укажите идентификатор пользователя. смотрите: Понимание того, как uid и gid работают в контейнерах Docker
  • -p, --password PASSWORD зашифрованный пароль новой учетной записи (например, ubuntu).

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

27
kenorb

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

RUN useradd -ms /bin/bash yourNewUserName
2
Karl Morrison

Добавление пользователя в 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, создания группы пользователей и пользователя, назначения пользователю разрешения для папки проекта, переключения на вновь созданного пользователя и запуска приложения под этим пользователем.

0
S.Mishra