Docker有点总是有一个USER
命令以特定用户身份运行进程,但一般来说很多事情必须以 ROOT 身份运行。
我见过很多使用ENTRYPOINT
with gosu
取消提升进程的运行权限。
我仍然对是否需要感到有点困惑gosu
。 USER 还不够吗?
我知道 Docker 1.10 在安全性方面发生了很大的变化,但我仍然不清楚在 docker 容器中运行进程的推荐方法。
有人可以解释一下我什么时候会使用gosu
vs. USER
?
EDIT:
码头工人最佳实践指南 https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/不是很清楚:它说如果进程可以在没有特权的情况下运行,请使用USER
,如果您需要 sudo,您可能需要使用gosu
。
这很令人困惑,因为人们可以以 ROOT 身份安装各种东西Dockerfile
,然后创建一个用户并赋予其适当的权限,最后切换到该用户并运行CMD
作为该用户。
那么为什么我们需要 sudo 或gosu
then?
Dockerfile 用于创建镜像。当您无法再在 Dockerfile 中的运行命令之间更改用户时,我认为 gosu 作为容器初始化的一部分更有用。
创建映像后,类似 gosu 的东西允许您在容器内的入口点末尾删除 root 权限。您最初可能需要 root 访问权限来执行一些初始化步骤(修复 uid、主机安装卷权限等)。然后,一旦初始化,您就可以在没有 root 权限的情况下运行最终的服务,并以 pid 1 的形式干净地处理信号。
编辑:
以下是在 docker 和 jenkins 的映像中使用 gosu 的简单示例:https://github.com/bmitch3020/jenkins-docker https://github.com/bmitch3020/jenkins-docker
Entrypoint.sh 查找 /var/lib/docker.sock 文件的 gid 并更新容器内 docker 用户的 gid 以进行匹配。这允许将映像移植到其他 docker 主机,其中主机上的 gid 可能不同。更改组需要容器内的 root 访问权限。如果我用过USER jenkins
在 dockerfile 中,我会被图像中定义的 docker 组的 gid 困住,如果它与正在运行的 docker 主机的 gid 不匹配,它将无法工作。但在运行应用程序时,root 访问权限可能会被删除,这就是 gosu 发挥作用的地方。
在脚本末尾, exec 调用阻止 shell 分叉 gosu,而是用该进程替换 pid 1。 Gosu 反过来也做同样的事情,切换 uid,然后执行 jenkins 进程,以便它作为 pid 1 接管。这允许正确处理信号,否则信号将被 shell 作为 pid 1 忽略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)