【问题标题】:Understanding Docker user/uid creation了解 Docker 用户/uid 创建
【发布时间】:2019-04-09 04:23:26
【问题描述】:

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

我明白以下几点:

  1. 图像的实例称为容器。
  2. uid/gid 由底层内核维护,而不是由 Container 维护。
  3. 内核理解 uid/gid 编号而不是用户名/组名,并且名称是别名,仅供人类阅读。
  4. 所有容器都是由 docker daemon 维护的进程,并且将在主机中作为进程可见 (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
  • 如果我多次运行同一个映像(即多个容器)会发生什么?是否将相同的uid 分配给所有进程?

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

  • uid 增量如何在 Container 中与主机相关。

任何指针都会有所帮助。

【问题讨论】:

    标签: docker containers dockerfile


    【解决方案1】:

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

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

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

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

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

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

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

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

    他们是完全独立的。

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

    【讨论】:

    • "是的,因为每个容器都从映像中获取相同 /etc/passwd 文件的副本。"不,这是因为每个容器都运行相同的映像,该映像被配置为以相同的 uid 运行。 /etc/passwd 中的内容无关紧要,uid 甚至根本不需要在其中。
    • 在容器中处理用户/组 ID 的最佳做法是什么?我刚才遇到的情况是,我的 Docker 用户是 id 为 0 的 root,当我在与主机映射的文件系统中创建一个文件时,该文件由主机上的 root 拥有。但是,该容器是由用户启动的。我认为这很危险,同时,至少我对 docker/host 用户/组的理解一直很差,我想在这方面做得更好,因为它在更多的情况下会导致问题,而不是我想要的。
    • 这可能最好作为一个单独的问题提出。通常建议不要在容器中成为 root,但特定的 uid 通常并不重要。如果你的容器不是无状态的并且有一个主机挂载的卷需要写入,那么当你运行容器时你需要指定一个正确的uid; Dockerfile 中没有内置任何内容。可能我对Docker non-root User Best Practices for Python Images? 的回答可能会给出一些方向。
    【解决方案2】:

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

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

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

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

    我强烈建议通过阅读以下文档了解用户命名空间和映射:Isolate containers with a user namespace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多