热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将用户添加到Docker容器

如何解决《将用户添加到Docker容器》经验,为你挑选了4个好方法。

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

小智.. 410

诀窍是使用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在调用user命令之前,您可能必须授予执行要运行的程序的权限.

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



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在调用user命令之前,您可能必须授予执行要运行的程序的权限.

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


我建议在Dockerfile中使用全名选项,比如在脚本中,而不是短脚本(在交互式IMO使用时更多).`useradd --create-home --shell/bin/bash`对于同事来说更容易理解/可读.
为了设置密码,您可以使用chpasswd,如:`RUN echo'newuser:newpassword'| chpasswd`
不错的小贴士,@ iuridiniz!不要忘记在"USER newuser"之前调用它.如果您还需要用户拥有root权限,您还可以包含`adduser sudo`.
`/ bin/sh:useradd:not found` alpine linux
请注意,如果您要创建具有大用户ID的新用户,则docker在尝试创建* lastlog *(海量稀疏文件)时可能会挂起/崩溃。避免使用useradd的--no-log-init选项。

2> Raffael..:

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

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

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

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

RUN adduser -D -g '' newuser

请参阅busybox adduser


谢谢!看起来像'adduser`高级解决方案通常更喜欢使用像`useradd`这样的低级函数.

3> kenorb..:

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.请参阅:了解uid和gid在Docker容器中的工作方式

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

要设置密码,请将:添加-p "$(openssl passwd -1 ubuntu)"到上面的命令.


用户为什么会在根组中?这不是要出于安全目的而拥有非root用户的全部意思
@Novaterata取决于用途。“ root”组并不表示他们具有root用户访问权限,只是他们具有对某些文件(例如日志)的更多读访问权限,这很有用,但这取决于项目。

4> S.Mishra..:

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


推荐阅读
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文介绍如何在阿里云环境中利用 Docker 容器化技术部署一个简单的 Flask Web 应用,并确保其可通过互联网访问。内容涵盖 Python 代码编写、Dockerfile 配置、镜像构建及容器运行等步骤。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
蜜爱女_201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有