将用户添加到Docker容器

rfj*_*001 237 linux ubuntu dockerfile

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

我尝试添加RUN adduser uwsgiRUN 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] 
Run Code Online (Sandbox Code Playgroud)

小智 410

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

RUN useradd -ms /bin/bash newuser
Run Code Online (Sandbox Code Playgroud)

这为用户创建了一个主目录,并确保bash是默认的shell.

然后你可以添加:

USER newuser
WORKDIR /home/newuser
Run Code Online (Sandbox Code Playgroud)

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

docker run -t -i image
newuser@131b7ad86360:~$
Run Code Online (Sandbox Code Playgroud)

newuser在调用user命令之前,您可能必须授予执行要运行的程序的权限.

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

  • 我建议在Dockerfile中使用全名选项,比如在脚本中,而不是短脚本(在交互式IMO使用时更多).`useradd --create-home --shell/bin/bash`对于同事来说更容易理解/可读. (119认同)
  • 为了设置密码,您可以使用chpasswd,如:`RUN echo'newuser:newpassword'| chpasswd` (20认同)
  • 不错的小贴士,@ iuridiniz!不要忘记在"USER newuser"之前调用它.如果您还需要用户拥有root权限,您还可以包含`adduser <username> sudo`. (8认同)
  • `/ bin/sh:useradd:not found` alpine linux (3认同)
  • @deathangel908 它在`shadow` 包中可用:`apk add shadow`。见 https://pkgs.alpinelinux.org/package/v3.8/community/x86/shadow (3认同)
  • 请注意,如果您要创建具有大用户ID的新用户,则docker在尝试创建* lastlog *(海量稀疏文件)时可能会挂起/崩溃。避免使用useradd的--no-log-init选项。 (2认同)

Raf*_*ael 82

要避免adduser的交互式问题,您可以使用以下参数调用它:

RUN adduser --disabled-password --gecos '' newuser
Run Code Online (Sandbox Code Playgroud)

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

在使用busybox(如Alpine)的系统上,请使用

RUN adduser -D -g '' newuser
Run Code Online (Sandbox Code Playgroud)

请参阅busybox adduser

  • 谢谢!看起来像'adduser`高级解决方案通常更喜欢使用像`useradd`这样的低级函数. (3认同)
  • --disabled-password 的作用是什么?我们如何在 Dockerfile 中同时为用户设置密码? (2认同)

ken*_*orb 55

Ubuntu的

请尝试以下行Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
Run Code Online (Sandbox Code Playgroud)

useradd选项(见:) man useradd:

  • -r,--system创建一个系统帐户.请参阅:创建系统帐户的含义
  • -m,--create-home创建用户的主目录.
  • -d,--home-dir HOME_DIR新帐户的主目录.
  • -s,--shell SHELL登录新帐户的shell.
  • -g,--gid GROUP主要组的名称或ID.
  • -G,--groups GROUPS补充小组名单.
  • -u,--uid UID指定用户ID.请参阅:了解uid和gid在Docker容器中的工作方式
  • -p,--password PASSWORD新帐户的加密密码(例如ubuntu).

    要设置密码,请将:添加-p "$(openssl passwd -1 ubuntu)"到上面的命令.

  • 用户为什么会在根组中?这不是要出于安全目的而拥有非root用户的全部意思 (2认同)
  • @Novaterata取决于用途。“ root”组并不表示他们具有root用户访问权限,只是他们具有对某些文件(例如日志)的更多读访问权限,这很有用,但这取决于项目。 (2认同)
  • 我可以看到这是有效的,我自动以用户身份登录,但我仍然生成 root 拥有的文件。我什至只使用“USER user”,因为我在本地用户和组上的用户名是“user”。仍然生成 root 拥有的文件。还有什么我应该做的吗?我基本上正在制作一个编译我们的代码库的 docker 容器。因此它从 svn 中检查代码,使用 bash 源设置变量。即使我从未被要求输入 root 密码,bash 命令是否可以以 root 身份执行操作? (2认同)
  • 为了安全起见,我建议 `-p "$(openssl passwd -6 YOUR_PASS_HERE)"`。“-1”选项使用不安全的基于 MD5 的哈希(以防数据库泄漏)。 (2认同)

Rya*_*iao 16

可以模仿开源的Dockerfile,例如:

节点: node12-github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
Run Code Online (Sandbox Code Playgroud)

超集: 超集-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset
Run Code Online (Sandbox Code Playgroud)

我认为这是遵循开源的好方法。


S.M*_*hra 7

从安全角度来看,在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"]
Run Code Online (Sandbox Code Playgroud)

上面的步骤是复制NodeJS项目文件,创建用户组和用户,为用户分配项目文件夹权限,切换到新创建的用户并在该用户下运行应用程序的完整示例。

  • addgroup 对我来说失败了,步骤 11/15 : RUN addgroup -S 用户名 ---&gt; 在 db9fd22d469d 中运行 选项 s 不明确(shell,系统) adduser [--home DIR] [--shell SHELL] [--no-create -home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup 组 | -home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] --gid ID] [--disabled-password] [--disabled-login] [--encrypt-home] USER 添加普通用户 (2认同)

Acu*_*nus 7

每个人都有自己的最爱,这是我的:

RUN useradd --user-group --system --create-home --no-log-init app
USER app
Run Code Online (Sandbox Code Playgroud)

参考:man useradd

RUN行将添加用户和组app

RUN useradd --user-group --system --create-home --no-log-init app
USER app
Run Code Online (Sandbox Code Playgroud)

使用比app将映像重新用作基本映像的名称更具体的名称。顺便说一句,--shell /bin/bash如果您确实需要,请包括在内。


部分信用:Ryan M 的回答


Luk*_*ski 6

或者你也可以这样做。

RUN addgroup demo && adduser -DH -G demo demo
Run Code Online (Sandbox Code Playgroud)

第一个命令创建名为demo的组。第二个命令创建演示用户并将其添加到之前创建的演示组中。

标志代表:

-G Group
-D Don't assign password
-H Don't create home directory
Run Code Online (Sandbox Code Playgroud)

  • PS 此命令可能会因 Linux 发行版而略有不同。 (2认同)