Добавить пользователя в контейнер 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]
Ответы
Ответ 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