当前位置: 首页 > 知识库问答 >
问题:

Docker使用Gosu vs USER

翟新
2023-03-14

Docker总是有一个USER命令来作为特定用户运行进程,但通常很多事情都必须作为ROOT运行。

我看到了很多图像,它们使用带有gosu的入口点来反提升流程以运行。

我仍然对是否需要gosu感到困惑。用户还不够吗?

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

有人能解释一下我什么时候会使用gosu和用户吗?

谢谢

编辑:

Docker最佳实践指南不是很清楚:它说如果进程可以在没有权限的情况下运行,请使用USER,如果您需要sudo,您可能希望使用gonu。这很令人困惑,因为人们可以在Dockerfile中以ROOT的形式安装各种东西,然后创建一个用户并赋予它适当的权限,然后最终切换到该用户并以该用户的身份运行CMD。那么我们为什么需要sudo或gosu呢?

共有3个答案

曾苗宣
2023-03-14

使用gosu的优点也是信号处理。例如,您可以通过重新加载systemctl来重新加载进程

郗亦
2023-03-14

我正在使用gosu和entrypoint。因为我希望容器中的用户具有与创建容器的用户相同的UID。

Docker卷和权限。

我正在创建的容器的目的是为了开发。我需要为linux构建,但我仍然需要所有本地(OS X)编辑、工具等的支持。我在容器内外保持UID不变,这使文件所有权更加合理,并防止了一些错误(容器用户无法编辑装入卷中的文件等)

喻渊
2023-03-14

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

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

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

入口点。sh查找/var/lib/docker的gid。并更新容器内docker用户的gid以匹配。这允许将图像移植到主机上gid可能不同的其他docker主机。更改组需要容器内的根访问权限。如果我在dockerfile中使用了用户jenkins,我将无法使用图像中定义的docker组的gid,如果它与运行它的docker主机的gid不匹配,则该gid将不起作用。但在运行应用程序时,根访问权限可能会被删除,而gosu正是在这个应用程序中发挥作用的。

在脚本的末尾,exec调用阻止shell分叉gonu,而是用该进程替换pid 1。osu反过来也做同样的事情,切换uid,然后执行jenkins进程,以便它作为pid 1接管。这允许正确处理信号,否则shell会作为pid 1忽略这些信号。

 类似资料:
  • Docker简介 Docker是一个容器运行平台,你可以将程序及其依赖打包成容器,在不同机器上运行可得到一致的运行效果。因为不同的系统环境或Go版本可能影响程序的运行结果,为了得到可预测、可重复的实验环境,我们引入了Docker容器技术。 Docker使用 我们不仅开源了示例代码,还创建了官方Docker镜像。 只要执行命令docker run -i -t tobegit3hub/understa

  • 本文向大家介绍使用Docker Swarm,包括了使用Docker Swarm的使用技巧和注意事项,需要的朋友参考一下 如果您正在使用微服务架构,则需要在不同机器上处理不同的项目组件,并创建一个主从架构,以便由主节点控制从节点,通过Docker Swarm部署项目可能会节省很多时间,的努力和资源。 Docker Swarm基本上是称为节点的物理机或虚拟机的群集,它们分别运行docker容器,您可以

  • 本节讲述了 Docker Hub 的快速入门,包括如何创建一个账户。 Docker Hub 存放着 Docker 及其组件的所有资源。Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 Docker。为此,它提供的服务有: Docker 镜像主机 用户认证 自动镜像构建和工作流程工具,如构建触发器和 web hooks 整合了 GitHub 和 BitBucket 为了使用 Dock

  • 主要内容:列出镜像列表,获取一个新的镜像,查找镜像,拖取镜像,删除镜像,创建镜像当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 下面我们来学习: 1、管理和使用本地 Docker 主机镜像 2、创建镜像 列出镜像列表 我们可以使用 docker images 来列出本地主机上的镜像。 各个选项说明: REPOSITORY:表示镜像的仓库源 TAG:镜像的标签 IMAGE ID

  • 主要内容:Docker 客户端,容器使用,运行一个 web 应用,查看 WEB 应用容器,网络端口的快捷方式,查看 WEB 应用程序日志,查看WEB应用程序容器的进程,检查 WEB 应用程序,停止 WEB 应用容器,重启WEB应用容器,移除WEB应用容器Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

  • Docker 是现今十分热门的容器引擎,可以让你轻松地打包、部署和使用应用程序以及服务。无论你是一个经验丰富的Docker开发者还是刚刚开始学习它,Visual Studio Code都可以让你轻松地创造Dockerfile和docker-compose.yml两个文件到你的开发目录中。 安装Docker扩展插件 VS Code通过插件的方式支持Docker的使用。安装这一扩展插件,只需要按下kb

  • Gitea 在其 Docker Hub 组织内提供自动更新的 Docker 镜像。可以始终使用最新的稳定标签或使用其他服务来更新 Docker 镜像。 该参考设置指导用户完成基于 docker-compose 的设置,但是 docker-compose 的安装不在本文档的范围之内。要安装 docker-compose 本身,请遵循官方安装说明。 基本 最简单的设置只是创建一个卷和一个网络,然后将

  • 上一节中,我们学会了如何从Docker Hub官方仓库中获取镜像。同时,我们已经知道,Docker镜像是静态的,要使用它,就是以镜像为模板,创建并运行Docker容器应用。 本节我们将详细介绍Docker容器的使用,在了解容器的各项操作之前,我们先来回顾一下,Docker 容器的生命周期里分为五种状态,其分别代表着: Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还