Docker 使用 gosu 与 USER

2023-12-27

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(使用前将#替换为@)

Docker 使用 gosu 与 USER 的相关文章

随机推荐