【问题标题】:Ensure both user name and user id are the same in host and Docker container确保主机和 Docker 容器中的用户名和用户 ID 相同
【发布时间】:2019-02-19 05:31:53
【问题描述】:

我正在尝试使用给定用户运行具有自定义映像的 Docker 容器。我有一个entrypoint.sh,它可以根据Docker命令行提供的环境变量来改变运行用户,-e USER=myuser

我在主机上有相同的用户。这可以在不同的主机上完成,我可以确保这个用户存在于我们使用的任何主机中。但是我遇到了麻烦,因为我无法确保该用户的数字 id 始终相同(例如 1001)。在 Docker 容器执行命令行中,我用-v <src>:<tgt> 挂载了一些本地文件夹,容器中的应用程序在<tgt> 中创建了额外的文件夹和文件。

问题在于,尽管主机中的用户和容器中的用户具有相同的名称(例如 myuser),但它的数字 id 可以更改(例如主机中的 5000 和容器中的 1001 ),所以在读取挂载路径下的文件和文件夹时出现问题。

在执行时,确保主机和运行容器中的用户名和用户 ID 都相同的最佳解决方案是什么?

编辑

我知道我根本没有解释自己,而且混杂了一些东西。我将尝试再次解释我的问题:

  1. 我确实创建了一个基于 Linux 的映像,并且在这个映像中我: a) 安装了一组包为 root; b) 创建了某个用户myuser,并在Dockerfile中切换到了USER <usr>的那个用户; c) 以myuser用户身份复制我自己的软件并安装在镜像中,并且该软件必须由该用户执行。

  2. 我在另一台机器上创建了同一个用户myuser

  3. 在另一台机器上从此映像启动了一个容器,并与该容器共享主机文件系统中的一些文件夹(由用户 myuser 拥有)。

问题出现是因为执行容器时用户myuser 的数字ID 在Docker 映像中为1001,而在其他主机中为5000。

一种解决方案是在任何时候在任何主机上创建用户时强制数字 id 相同。问题是我不能确定这在运行图像的主机中是否总是可行的。

【问题讨论】:

    标签: bash docker containers userid


    【解决方案1】:

    如果您使用的是基于 linux 的镜像(例如 ubuntu),在您的 Dockerfile 中,您将需要类似

    sudo addgroup --gid 3000 mygroupname && 
    sudo adduser --uid 4000 --gid 3000 --disabled-password --gecos "" myusername
    
    1. 我使用 3000 和 4000 作为示例。它们都可以相同 如果你想让他们成为数字。
    2. 是否禁用密码取决于您要对用户执行的操作。
    3. gecos 用于为用户设置全名、房间号、工作电话等。我们将它们全部设置为空白。如果您愿意,您绝对可以将它们设置为更有用的东西。

    您将不得不切换到该用户,并可能将该用户的主目录用作您的工作目录。 Dockerfile 中的行是:

    USER myusername
    WORKDIR /home/myusername
    

    【讨论】:

    • 谢谢,我当然会这样做。问题是我在图像和主机中得到了不同的数字 ID。一种解决方案是强制这些 id 相同,但我无法确保主机的这一点(请参阅我在问题中的编辑,因为我一开始没有解释自己)。
    【解决方案2】:

    您应该使用命令USER 在 Dockerfile 中指定用户。选项-e USER=myuser会创建一个环境变量,但默认不会改变用户。

    参考:https://docs.docker.com/engine/reference/builder/#user

    【讨论】:

    • 谢谢,我当然会这样做。请参阅我在问题中的编辑,因为我一开始没有解释自己。
    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多