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

问题描述 投票:0回答:2

我正在尝试使用给定用户运行带有自定义映像的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
2个回答
1
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.