docker - 了解 Docker 用户/uid 创建

标签 docker containers dockerfile

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

我理解以下几点:

  • 图像的实例称为容器。
  • uid/gid 由底层内核维护,而不是由容器维护。
  • 内核理解 uid/gid 编号而不是用户名/组名,名称是别名,仅供人类阅读。
  • 所有容器都是由 docker 守护进程维护的进程,并且将作为主机中的进程可见 (ps -ef)
  • 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怎么了增量发生在与主机相关的容器中。

  • 任何指针都会有所帮助。

    最佳答案

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

  • 数字用户 ID 是什么;和
  • /etc/passwd里面有什么|文件。

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

    What happens if I run the same image multiple times i.e multiple containers? Will the same uid be assigned to all processes?



    是的,因为每个容器都会获得相同 /etc/passwd 的副本来自图像的文件。

    What happens if I add same above command in another image and run that image as container? - will I get new uid or same uid as the previous one?



    这取决于什么adduser确实如此;它可以相同或不同。

    How the uid increment happens in Container in relation with the host machine.



    他们是完全独立的。

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

    关于docker - 了解 Docker 用户/uid 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55585091/

    相关文章:

    performance - ELK监控Kubernetes

    docker - 如何通过编辑器在容器Docker中编辑文件

    docker - containerd.io 与 docker-ce-cli 与 docker-ce : what are the differences and what does each package do?

    c++ - 容器和派生类

    bash - Docker-Compose:Bash 命令替换

    c++ - C++模板类-继承调用错误的函数

    c++ - 对象从容器中删除自身

    git - 如何为同步源代码构建 docker 容器?

    docker - 如何安装Xpack在Docker上运行的Elasticsearch?

    docker - OCI 运行时创建失败