2014-12-30 8 views
114

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

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

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

Изображение My 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] 

ответ

218

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

RUN useradd -ms /bin/bash newuser 

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

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

USER newuser 
WORKDIR /home/newuser 

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

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

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

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

+0

Is «новый_пользователь» имя пользователя, которое вы сами выбираете? –

+0

Да, точно. Замените его именем по вашему выбору. –

+44

Я бы рекомендовал использовать параметры полного имени в файле Docker, как в скрипте, вместо коротких (больше для использования в интерактивном режиме IMO). 'useradd --create-home --shell/bin/bash' более понятный/читаемый для коллег. –

38

Чтобы избежать интерактивные вопросы по AddUser, вы можете вызвать его с этими параметрами:

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

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

В системах с BusyBox (как Alpine), используйте

RUN adduser -D -g '' newuser 

См busybox adduser

+1

Спасибо! Похоже, что решение высокого уровня «adduser» обычно предпочтительнее использовать низкоуровневые функции, такие как 'useradd'. – akhmed

+0

'adduser: непризнанный вариант: gecos' Это, похоже, не работает на Alpine. – weberc2

1

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

RUN useradd -ms /bin/bash yourNewUserName 
+7

немного больше объяснений будет хорошо ... – wmk

-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 
Смежные вопросы