确保主机和 Docker 容器中的用户名和用户 ID 相同

Ensure both user name and user id are the same in host and Docker container

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

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

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

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

编辑

我发现我根本没有解释自己,并且把事情搞混了。我会尝试再次解释我的问题:

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

  2. 我在另一台机器上创建了完全相同的用户myuser

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

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

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

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

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

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

的内容
sudo addgroup --gid 3000 mygroupname && 
sudo adduser --uid 4000 --gid 3000 --disabled-password --gecos "" myusername
  1. 我以 3000 和 4000 为例。它们可以相同 如果您希望它们成为数字。
  2. 是否禁用密码取决于你想对用户做什么。
  3. gecos 用于设置用户的全名、房间号、工作phone等。我们将它们全部设置为空白。如果你愿意,你绝对可以将它们设置为更有用的东西。

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

USER myusername
WORKDIR /home/myusername