了解Docker用户/ uid的创建

时间:2019-04-09 04:23:27

标签: docker containers dockerfile

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

我了解以下几点:

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

总而言之,当我在Dockerfile中输入以下命令时,我假定将使用递增的uid创建一个新用户(<div class="wrapper"> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> </div>)。

my-user
  • 如果我多次运行同一图像(即多个容器)会怎样?会为所有进程分配相同的RUN addgroup my-group && adduser -D my-user -G my-group 吗?

  • 如果我在另一个映像中添加上述命令,然后将该映像作为容器运行,会发生什么情况? -我会得到新的uid还是与上一个相同的uid

  • 容器中uid增量与主机有关的发生方式。

任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

  

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

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

  

如果我在另一个映像中添加上述命令,然后将该映像作为容器运行,会发生什么情况? -我将获得新的uid还是与上一个相同的uid?

这取决于adduser的实际功能;它可以相同或不同。

  

容器中与主机有关的uid增量如何发生。

它们是完全独立的。

还请记住,您可以docker push / docker pull生成的映像在其他主机上运行。这样可以将图像的/etc/passwd文件与之合并在一起,但是主机环境可能完全不同。相应地,在Dockerfile中尝试匹配某些特定主机的uid映射不是最佳实践,因为如果尝试在其他任何地方运行相同的映像,那将是错误的。

答案 1 :(得分:1)

当您尝试在RUN语句中添加用户时,它不会在主机上创建用户。如果您在启动容器时未在Dockerfile中使用USER语句或-u标志指定用户(假设父Dockerfile也未包含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