gpt4 book ai didi

Docker 使用 gosu vs USER

转载 作者:IT老高 更新时间:2023-10-28 12:35:22 25 4
gpt4 key购买 nike

Docker 总是有一个 USER 命令以特定用户身份运行进程,但通常很多东西都必须以 ROOT 身​​份运行。

我见过很多使用 ENTRYPOINTgosu 来降低进程运行的图像。

我仍然对 gosu 的需求感到有些困惑。 USER 还不够吗?

我知道 Docker 1.10 在安全性方面发生了很大变化,但我仍然不清楚在 docker 容器中运行进程的推荐方法。

谁能解释一下我什么时候会使用 gosuUSER

谢谢

编辑:

docker best practice guide不是很清楚:它说如果进程可以在没有权限的情况下运行,请使用 USER,如果需要 sudo,则可能要使用 gosu。这很令人困惑,因为可以在 Dockerfile 中以 ROOT 身​​份安装各种东西,然后创建一个用户并为其赋予适当的权限,最后切换到该用户并运行 CMD 作为该用户。那么为什么我们需要 sudo 或 gosu 呢?

最佳答案

Dockerfiles 用于创建镜像。当您无法再在 Dockerfile 中的运行命令之间更改用户时,我认为 gosu 作为容器初始化的一部分更有用。

创建镜像后,像 gosu 这样的东西允许您在容器内的入口点末尾删除 root 权限。您最初可能需要 root 访问权限来执行一些初始化步骤(修复 uid、主机安装的卷权限等)。然后一旦初始化,您就可以在没有 root 权限的情况下以 pid 1 的身份运行最终服务以干净地处理信号。


编辑:这是一个在 docker 和 jenkins 的镜像中使用 gosu 的简单示例:https://github.com/bmitch3020/jenkins-docker

entrypoint.sh 查找/var/lib/docker.sock 文件的 gid 并更新容器内 docker 用户的 gid 以匹配。这允许将镜像移植到主机上的 gid 可能不同的其他 docker 主机。更改组需要容器内的 root 访问权限。如果我在 dockerfile 中使用了 USER jenkins,我会被图像中定义的 docker 组的 gid 卡住,如果它与正在运行的 docker 主机的 gid 不匹配,它将无法工作上。但是在运行 gosu 所在的应用程序时可以删除 root 访问权限。

在脚本结束时, exec 调用阻止 shell 派生 gosu,而是用该进程替换 pid 1。 Gosu 反过来做同样的事情,切换 uid,然后执行 jenkins 进程,以便它作为 pid 1 接管。这允许正确处理信号,否则会被 shell 作为 pid 1 忽略。

关于Docker 使用 gosu vs USER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36781372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com