我有一个 docker 容器,里面运行着一些进程(uwsgi 和 celery)。我想为这些进程创建一个 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]
诀窍是使用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 身份,然后才能以超级用户权限执行命令。
我建议在 Dockerfile 中使用全名选项,就像在脚本中一样,而不是短选项(在 IMO 交互使用时使用更多)。
useradd --create-home --shell /bin/bash
对同事来说更容易理解/可读。为了设置密码,您可以使用 chpasswd ,如:
RUN echo 'newuser:newpassword' | chpasswd
请注意,如果您正在创建具有大用户 ID 的新用户,则 docker 在尝试创建lastlog 时可能会挂起/崩溃- 一个庞大的稀疏文件。使用
--no-log-init
选项避免这种情况useradd
。不错的提示,@iuridiniz!不要忘记之前调用它
USER newuser
。如果您还需要用户具有 root 权限,您还可以包含adduser <username> sudo
./bin/sh: useradd: not found
高山Linux