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


推荐阅读
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 过去查询Mysql的时候,都见3306对所有端口开放着,感觉不安全。netstat -anlp | grep mysqltcp 0&am ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文介绍了Spring 2.0引入的TaskExecutor接口及其多种实现,包括同步和异步执行任务的方式。文章详细解释了如何在Spring应用中配置和使用这些线程池实现,以提高应用的性能和可管理性。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • Ping 命令的高级用法与技巧
    本文详细介绍了 Ping 命令的各种高级用法和技巧,帮助读者更好地理解和利用这一强大的网络诊断工具。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
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社区 版权所有