如何向 Docker 容器添加用户?

2024-10-17 08:47:00
admin
原创
70
摘要:问题描述:我有一个 docker 容器,里面运行着一些进程(uwsgi 和 celery)。我想为这些进程创建一个 celery 用户和一个 uwsgi 用户,以及一个它们都属于的工作组,以便分配权限。我尝试将RUN adduser uwsgi和添加RUN adduser celery到我的 Dockerfi...

问题描述:

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

解决方案 1:

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

解决方案 2:

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新账户的登录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 指令是确保在使用管道-o pipefail之前启用该选项。阅读更多: Hadolint:对 Dockerfile 进行 Linting。RUN

解决方案 3:

为了避免adduser的交互式提问,你可以使用以下参数来调用它:

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

--gecos参数用于设置附加信息。本例中为空。

在带有 busybox 的系统上(例如 Alpine),使用

RUN adduser -D -g '' newuser

查看busybox adduser

解决方案 4:

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

解决方案 5:

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

节点: node12-github

RUN groupadd --gid 1000 node \n    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

超集: superset-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

我认为这是关注开源的好方法。

解决方案 6:

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

RUN useradd --user-group --system --create-home --no-log-init app
USER app

参考:man useradd ( alt )

上面这一RUN行将添加用户和组app

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

如果要将图像重新用作基础图像,请使用更具体的名称app。另外,--shell /bin/bash如果您确实需要,请包含。


部分荣誉:Ryan M 的回答

解决方案 7:

或者,您也可以这样做。

RUN addgroup demo && adduser -DH -G demo demo

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

旗帜代表:

-G Group
-D Don't assign password
-H Don't create home directory

解决方案 8:

WORKDIR /api

RUN adduser -D nameuser

COPY --from=builder --chown=nameuser:nameuser /api

USER nameuser

解决方案 9:

请在 dockerfile 中添加以下条目以便在容器中创建 sudo 用户。

RUN useradd -m  -s /bin/bash ubuntu
RUN usermod -aG sudo ubuntu && echo "ubuntu ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ubuntu
RUN chmod 0440 /etc/sudoers.d/ubuntu // should be 0440
USER ubuntu:ubuntu
WORKDIR /home/ubuntu

解决方案 10:

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

RUN useradd -ms /bin/bash yourNewUserName
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用