了解Docker用户/ uid创建

问题描述 投票:2回答:2

即使经过大量的材料和SO答案仍然我不清楚docker uid /用户使用或实现。

我理解以下几点:

  1. 图像的实例称为容器。
  2. uid / gid由底层内核维护,而不是由Container维护。
  3. 内核了解uid / gid编号而不是username / groupname,name是别名,仅供人类阅读。
  4. 所有容器都是由docker守护程序维护的进程,并且将作为主机中的进程显示(ps -ef)
  5. root(id = 0)是容器中的默认用户,可以通过Dockerfile中的USER指令或在docker run中传递-u标志来更改

有了上面所说的,当我在Dockerfile中有下面的命令时,我假设将使用递增的uid创建一个新用户(my-user)。

RUN addgroup my-group && adduser -D my-user -G my-group
  • 如果我多次运行相同的图像,即多个容器,会发生什么?是否会将相同的uid分配给所有流程?
  • 如果我在另一个图像中添加上述命令并将该图像作为容器运行,会发生什么? - 我会获得新的uid或与前一个相同的uid吗?
  • 如何在Container中与主机相关的uid增量。

任何指针都会有所帮助。

docker containers dockerfile
2个回答
2
投票

缺少user namespace remapping,只有两件事重要:

  1. 数字用户ID是什么;和
  2. 什么是/etc/passwd文件。

请记住,每个容器和主机都有单独的文件系统,因此每个东西都可以有单独的/etc/passwd文件。

如果我多次运行相同的图像,即多个容器,会发生什么?将同一个uid分配给所有进程吗?

是的,因为每个容器都从图像中获取相同/etc/passwd文件的副本。

如果我在另一个图像中添加上述命令并将该图像作为容器运行,会发生什么? - 我会获得新的uid或与前一个相同的uid吗?

这取决于adduser实际上做了什么;它可以是相同的也可以是不同的。

如何在与主机相关的Container中发生uid增量。

他们是完全独立的。

还要记住,你可以在docker push / docker pull上构建一个图像,在不同的主机上运行它。这将带来图像的/etc/passwd文件,但主机环境可能完全不同。相应地,尝试在Dockerfile中匹配某个特定主机的uid映射并不是最佳做法,因为如果尝试在其他任何地方运行相同的映像,那将是错误的。


1
投票

当您尝试在RUN语句中添加用户时,它不会在主机上创建用户。如果在启动容器时没有在Dockerfile或USER标志中指定用户使用-u语句(假设父Dockerfiles也不包含USER语句),则主机上的容器进程将以root用户身份运行,如果已启动docker守护程序作为root。 因此,如果您使用RUN addgroup my-group && adduser -D my-user -G my-group创建用户,它将只在容器中创建用户,即用户是容器的本地用户。因此,您运行的该映像的每个实例(容器)将具有容器内用户的相同uid。注意:该用户将不存在于主机上。

如果要将主机上的容器进程作为另一个用户(存在于主机上)运行,那么您有3个选项:

  • 在Dockerfile中添加USER语句
  • 运行容器时使用-u标志
  • 您可以使用docker的用户命名空间功能

我强烈建议您阅读本文档来了解用户命名空间和映射:Isolate containers with a user namespace

© www.soinside.com 2019 - 2024. All rights reserved.