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

J C*_*lez 5 bash containers userid docker

我正在尝试使用给定用户运行带有自定义映像的 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,并USER <usr>在 Dockerfile 中切换到该用户;c) 以用户身份复制我自己的软件并安装在映像中myuser,并且该软件必须由该用户执行。

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

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

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

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

小智 2

如果您使用基于 Linux 的映像(例如 ubuntu),在您的 Dockerfile 中,您将需要类似的内容

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

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

USER myusername
WORKDIR /home/myusername
Run Code Online (Sandbox Code Playgroud)