docker - 以root用户身份运行docker镜像,以非root用户身份运行服务
问题描述
从安全的角度来看,我试图了解两者之间的区别
USER
使用dockerfile中的指令以非 root 用户身份运行映像本身- 以 root 身份运行映像并以非 root
用户身份单独运行服务
在第二个选项中,将有一个以 root 身份运行并以非 root 用户身份启动服务的启动脚本。
这两个是等价的吗?考虑到启动脚本以 root 身份运行,第二个选项是否容易受到攻击?启动服务后是否退出(或不退出)是否重要?
对不起,如果这个问题已经被问及并得到了回答。
解决方案
真正重要的是,一旦您的服务启动并运行,它就不会以 root 身份运行。(这在 Docker 中没有那么重要,但“不要成为 root”仍然被认为是最佳实践。)您提出的两个选项都是有效的方法。
您的第二个选项“以 root 身份启动然后放弃特权”在 Docker 中并不常见,但它在精神上与大多数 Unix 守护程序所做的相匹配。官方 Hashicorp 领事形象是我所知道的一件事,它实际上是这样做的。特别是,它希望以挂载的某些数据目录启动,因此chown -R consul
在守护程序正确启动之前,它以 root 身份使用数据目录。我希望这是这种模式的一个非常典型的用法。
如果您不需要进行这种预启动设置,USER
那么在您的末尾指定一些任意的非 root 在Dockerfile
机制上更容易并选中相同的“不要成为 root”框。
关于尝试以当前主机用户身份运行容器,或尝试针对主机文件系统运行打包在 Docker 中的工具,存在许多 SO 问题。这很尴尬,因为 Docker 的一个关键设计目标是将容器与这些主机细节隔离开来。如果您需要选择运行容器进程的用户,您需要标准docker run -u
选项并且需要第一个选项。
推荐阅读
- javascript - 如何解决“画布被跨域数据污染”
- java - 从 Tomcat9 运行的 Spark 驱动程序,无法将文件加载到 java 并行流中的 spark 会话中
- javascript - 更改 VSCode 默认格式化程序以将数组项放在新行上?
- powershell - 调用命令的 LastExitCode 与条件不匹配
- bash - 通过命令行为 bash 提供参数
- reactjs - 如何使用组件中的本地状态更新 redux 状态
- jsp - 将带有单选按钮值的多行传递到下一页
- android - 图片未显示在推送通知中
- sqlite - 从 SQLITE 中的两列中选择不同的值
- neo4j - 如何有效地计算 Cypher 中两个节点之间的所有路径?