如何将用户添加到 Docker 容器?

新手上路,请多包涵

我有一个 docker 容器,里面运行着一些进程(uwsgi 和 celery)。我想为这些进程创建一个 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]

原文由 rfj001 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 742
2 个回答

诀窍是使用 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 才能以超级用户权限执行命令。

原文由 Paul Staab 发布,翻译遵循 CC BY-SA 3.0 许可协议

Ubuntu

Dockerfile 中尝试以下行:

 RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useradd 选项(参见: man useradd ):

  • -r , --system 创建系统账户。请参阅: 创建 系统帐户 的含义
  • -m , --create-home 创建用户的主目录。
  • -d , --home-dir HOME_DIR 新账户的主目录。
  • -s , --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)" 添加到 useradd 命令。

或者将以下行添加到您的 Dockerfile

 SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd

第一个 shell 指令 是确保在 --- 之前启用 RUN -o pipefail 选项,其中包含管道。阅读更多: Hadolint:整理你的 Dockerfile

原文由 kenorb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题