首页 文章

将用户添加到Docker容器

提问于
浏览
157

我有一个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]

5 回答

  • 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才能执行具有超级用户权限的命令 .

  • 291

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

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

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

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

    RUN adduser -D -g '' newuser
    

    busybox adduser

  • 21

    Ubuntu

    请尝试 Dockerfile 中的以下行:

    RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
    USER ubuntu
    WORKDIR /home/ubuntu
    

    useradd options(见: man useradd ):

    • -d--home-dir HOME_DIR 新帐户的主目录 .

    • -m--create-home 创建用户的主目录 .

    • -s--shell SHELL 新帐户的登录shell .

    • -g--gid GROUP 主要组的名称或ID .

    • -G--groups GROUPS 补充小组名单 .

    • -p--password PASSWORD 新帐户的加密密码(例如 ubuntu ) .

  • -4

    将此行添加到Dockerfile(您可以通过这种方式运行任何linux命令)

    RUN useradd -ms /bin/bash yourNewUserName
    
  • 64

    这是另一个例子(如果您有一些网络目录处于活动状态)

    (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
    

相关问题