我有一个docker容器,里面运行着一些进程(uwsgi和celery)。我想为这些进程创建一个芹菜用户和一个uwsgi用户以及他们都属于的工作组,以便分配权限。
我尝试将RUN adduser uwsgi
和RUN adduser celery
添加到我的Dockerfile中,但这会导致问题,因为这些命令会提示输入(我已经在下面的构建中发布了响应)。
将用户添加到Docker容器以便为容器中运行的工作程序设置权限的最佳方法是什么?
我的Docker镜像是从官方Ubuntu14.04基础构建的。
以下是运行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]
答案 0 :(得分:354)
诀窍是使用useradd
而不是其交互式包装adduser
。
我通常创建用户:
RUN useradd -ms /bin/bash newuser
为用户创建主目录,并确保bash是默认shell。
然后您可以添加:
USER newuser
WORKDIR /home/newuser
到您的dockerfile。之后的每个命令以及交互式会话都将以用户newuser
执行:
docker run -t -i image
newuser@131b7ad86360:~$
在调用用户命令之前,您可能必须授予newuser
执行要运行的程序的权限。
出于安全原因,在容器内使用非特权用户是个好主意。它也有一些缺点。最重要的是,从图像中获取图像的人必须切换回root才能执行具有超级用户权限的命令。
答案 1 :(得分:73)
要避免adduser的交互式问题,您可以使用以下参数调用它:
RUN adduser --disabled-password --gecos '' newuser
--gecos
参数用于设置其他信息。在这种情况下它只是空的。
在使用busybox(如Alpine)的系统上,使用
RUN adduser -D -g '' newuser
答案 2 :(得分:34)
在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
创建系统帐户。 请参阅:Implications creating system accounts -m
,--create-home
创建用户的主目录。-d
,--home-dir HOME_DIR
新帐户的主目录。-s
,--shell SHELL
新帐户的登录shell。-g
,--gid GROUP
主要群组的名称或ID。-G
,--groups GROUPS
补充小组名单。-u
,--uid UID
指定用户ID。 请参阅:Understanding how uid and gid work in Docker containers -p
,--password PASSWORD
新帐户的加密密码(例如ubuntu
)。
要设置密码,请在上面的命令中添加:-p "$(openssl passwd -1 ubuntu)"
。
答案 3 :(得分:4)
您可以模仿开源Dockerfile,例如:
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid node --shell /bin/bash --create-home node
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash
superset
我认为这是遵循开源的好方法。
答案 4 :(得分:3)
从安全角度来看,在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 :(得分:2)
每个人都有自己的最爱,这是我的:
RUN useradd --user-group --system --create-home --no-log-init app
USER app
参考:man useradd
RUN
行将添加用户和组app
:
root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)
如果要将图像重新用作基础图像,请使用比app
更具体的名称。顺便说一句,如果您确实需要,请加入--shell /bin/bash
。
部分信用:answer by Ryan M
答案 6 :(得分:2)
或者,您也可以这样做。
RUN addgroup demo && adduser -DH -G demo demo
第一个命令创建名为 demo 的组。第二条命令创建 demo 用户,并将其添加到先前创建的 demo 组中。
标志代表:
-G Group
-D Don't assign password
-H Don't create home directory
答案 7 :(得分:-4)
这是另一个例子(如果您有一些网络目录处于活动状态)
(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