即使经过大量材料和SO解答,我仍然不清楚docker uid /用户的用法或实现。
我了解以下几点:
总而言之,当我在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
增量与主机有关的发生方式。
任何指针都会有所帮助。
答案 0 :(得分:2)
缺少user namespace remapping,只有两件事很重要:
/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个选项:
USER
语句-u
标志我强烈建议您阅读以下文档来了解用户名称空间和映射:Isolate containers with a user namespace