即使经过大量的材料和SO答案仍然我不清楚docker uid /用户使用或实现。
我理解以下几点:
有了上面所说的,当我在Dockerfile中有下面的命令时,我假设将使用递增的uid创建一个新用户(my-user
)。
RUN addgroup my-group && adduser -D my-user -G my-group
uid
分配给所有流程?uid
或与前一个相同的uid
吗?uid
增量。任何指针都会有所帮助。
缺少user namespace remapping,只有两件事重要:
/etc/passwd
文件。请记住,每个容器和主机都有单独的文件系统,因此每个东西都可以有单独的/etc/passwd
文件。
如果我多次运行相同的图像,即多个容器,会发生什么?将同一个uid分配给所有进程吗?
是的,因为每个容器都从图像中获取相同/etc/passwd
文件的副本。
如果我在另一个图像中添加上述命令并将该图像作为容器运行,会发生什么? - 我会获得新的uid或与前一个相同的uid吗?
这取决于adduser
实际上做了什么;它可以是相同的也可以是不同的。
如何在与主机相关的Container中发生uid增量。
他们是完全独立的。
还要记住,你可以在docker push
/ docker pull
上构建一个图像,在不同的主机上运行它。这将带来图像的/etc/passwd
文件,但主机环境可能完全不同。相应地,尝试在Dockerfile中匹配某个特定主机的uid映射并不是最佳做法,因为如果尝试在其他任何地方运行相同的映像,那将是错误的。
当您尝试在RUN
语句中添加用户时,它不会在主机上创建用户。如果在启动容器时没有在Dockerfile或USER
标志中指定用户使用-u
语句(假设父Dockerfiles也不包含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