将用户添加到Docker容器

我有一个docker容器,里面运行着一些进程(uwsgi和芹菜)。 我想为这些进程创build一个芹菜用户和一个uwsgi用户,以及它们都属于的工作组,以分配权限。

我尝试将RUN adduser uwsgiRUN adduser celery到我的Dockerfile中,但是这会导致问题,因为这些命令提示input(我已经发布了下面的内部版本的响应)。

将用户添加到Docker容器以便为在容器中运行的工作人员设置权限的最佳方式是什么?

我的Docker镜像是从官方的Ubuntu14.04基础上构build的。

以下是运行adduser命令时Dockerfile的输出:

 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] 

诀窍是使用useradd而不是它的交互包装adduser 。 我通常创build用户:

 RUN useradd -ms /bin/bash newuser 

它为用户创build一个主目录,并确保bash是默认的shell。

你可以添加:

 USER newuser WORKDIR /home/newuser 

到你的dockerfile。 之后的每个命令以及交互式会话将以用户newuser身份执行:

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

在调用用户命令之前,您可能必须为新用户授予执行您要运行的程序的权限。

在容器内部使用非特权用户是出于安全原因的一个好主意。 它也有一些缺点。 最重要的是,从图像中获取图像的人必须切换回根,才能以超级用户权限执行命令。

为了避免adduser的互动问题,你可以用下面的参数来调用它:

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

--gecos参数用于设置附加信息。 在这种情况下,它只是空的。

 RUN useradd -ms /bin/bash yourNewUserName 

这是又一个例子(如果你有一些networking目录活跃)

 (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' 

并创build一些有用的用户组

 useradd -g cdrom,floppy,audio,dip,video,plugdev,netdev,lpadmin,scanner,bluetooth,docker --create-home --shell $SHELL gitlabuser