当前位置: 首页>>技术问答>>正文


将用户添加到Docker容器

, ,

问题描述

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

最佳解决思路

诀窍是使用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执行要运行的程序的权限。

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

次佳解决思路

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

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

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

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

RUN adduser -D -g '' newuser

请参阅busybox adduser

第三种解决思路

Ubuntu

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创建系统帐户。请参阅:创建系统帐户的含义

  • -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)"添加到上述命令。

第四种思路

在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项目文件的完整示例,创建用户组和用户,为项目文件夹的用户分配权限,切换到新创建的用户并在该用户下运行应用程序。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6737.html,未经允许,请勿转载。