了解 Docker 用户/uid 创建

Har*_*ran 6 containers docker dockerfile

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

我理解以下几点:

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

综上所述,当我的 Dockerfile 中有以下命令时,我假设my-user将创建一个具有递增 uid的新用户 ( )。

RUN addgroup my-group && adduser -D my-user -G my-group
Run Code Online (Sandbox Code Playgroud)
  • 如果我多次运行同一个镜像,即多个容器,会发生什么?将相同的uid分配给所有进程吗?

  • 如果我在另一个图像中添加相同的上述命令并将该图像作为容器运行会发生什么?- 我会得到新的uid还是uid和以前的一样?

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

任何指针都会有所帮助。

Aks*_*hah 3

当您尝试在RUN语句中添加用户时,它不会在主机上创建用户。如果在启动容器时没有使用USERDockerfile 中的语句或-u标志指定用户(假设父 Dockerfile 也不包含 USER 语句),则root如果您启动了 docker 守护进程,主机上的容器进程将简单地以用户身份运行作为根。

因此,如果您使用RUN addgroup my-group && adduser -D my-user -G my-group它创建一个用户,则只会在容器中创建一个用户,即该用户是容器的本地用户。因此,您运行的该映像的每个实例(容器)都将具有容器内用户的相同 uid。注意:该用户不会存在于主机上。

如果您想以另一个用户(存在于主机上)的身份在主机上运行容器进程,那么您有 3 个选项:

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

我强烈建议通过阅读此文档来了解用户命名空间和映射:使用用户命名空间隔离容器