Подтвердить что ты не робот

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

У меня есть контейнер для докеров, в котором работают некоторые процессы (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] 
4b9b3361

Ответ 1

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

RUN useradd -ms /bin/bash newuser

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

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

USER newuser
WORKDIR /home/newuser

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

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

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

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

Ответ 2

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

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

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

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

RUN adduser -D -g '' newuser

См. Busybox adduser

Ответ 3

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 Создать системную учетную запись. see: Implications creating system accounts
  • -m, --create-home Создайте домашний каталог пользователя.
  • -d, --home-dir HOME_DIR Домашний каталог новой учетной записи.
  • -s, --shell SHELL Оболочка для входа в новую учетную запись.
  • -g, --gid GROUP Имя или идентификатор основной группы.
  • -G, --groups GROUPS Список дополнительных групп.
  • -u, --uid UID Укажите идентификатор пользователя. see: Understanding how uid and gid work in Docker containers
  • -p, --password PASSWORD Зашифрованный пароль новой учетной записи (например, ubuntu).

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

Ответ 4

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

Ответ 5

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

RUN useradd -ms /bin/bash yourNewUserName

Ответ 6

Вы можете имитировать Dockerfile с открытым исходным кодом, например:

Узел: node12-github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

superset: superset-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

Я думаю, что это хороший способ следовать открытым исходным кодом.

Ответ 7

У каждого есть свой личный фаворит, и это мое:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

Ссылка: man useradd

Строка RUN добавит пользователя и группу app:

[email protected]:/# id app
uid=999(app) gid=999(app) groups=999(app)

Используйте более конкретное имя, чем app, если изображение будет использоваться повторно в качестве базового. Кроме того, включите --shell /bin/bash, если вам действительно нужно.


Частичный кредит: ответ райана М

Ответ 8

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

(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