Docker 使用 gosu vs USER

标签 docker dockerfile

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/

相关文章:

Docker .NET Core - 解决方案中的多个项目

docker - 通过远程Docker API无法看到Docker镜像

Windows 上的 Dockerfile 复制超时问题

docker - Kubernetes和Dockerfile

linux - 内核内存增长在 ubuntu 中的 docker 容器中创建文件

linux - 如何获取当前时间的 docker 统计信息?

apache - 准备Docker容器以通过Shell或exec进行最坏情况的救援

mysql - Docker Compose phpmyadmin 未连接到 MySQL

amazon-web-services - 如何上传Project + Dockerfile并在AWS上构建而不是在本地构建并将Docker镜像上传到ECS?

docker - 当文件存在时,Docker Build抛出文件未找到错误