确保主机和 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 可以更改(例如主机中的 5000
和1001
在容器中),所以在读取挂载路径下的文件和文件夹时出现问题。
确保在执行时不仅用户名而且用户 ID 在主机和 运行ning 容器中都相同的最佳解决方案是什么?
编辑
我发现我根本没有解释自己,并且把事情搞混了。我会尝试再次解释我的问题:
我确实创建了一个基于 Linux 的镜像,在这个镜像中我:a) 安装了一组包作为 root
; b) 创建了某个用户 myuser
,并在 Docker 文件中使用 USER <usr>
切换到该用户;和 c) 复制我自己的软件并安装在图像中,作为用户 myuser
,并且该软件必须由该用户执行。
我在另一台机器上创建了完全相同的用户myuser
在另一台机器上从此图像启动了一个容器,并从主机文件系统与该容器共享了一些文件夹(由用户 myuser
所有)。
问题的出现是因为用户 myuser
的数字 ID 在 Docker 图像中是 1001,而在其他主机中是 5000,当执行容器时。
一个解决方案是在任何主机上创建用户时都强制使用相同的数字 ID。问题是我不能确定这在 运行 图像的主机中总是可能的。
您应该使用命令 USER
在 Dockerfile 中指定用户。选项 -e USER=myuser
将创建一个环境变量,但默认情况下不会更改用户。
如果您使用的是基于 linux 的图像(例如 ubuntu),在您的 Dockerfile 中,您将需要类似
的内容
sudo addgroup --gid 3000 mygroupname &&
sudo adduser --uid 4000 --gid 3000 --disabled-password --gecos "" myusername
- 我以 3000 和 4000 为例。它们可以相同
如果您希望它们成为数字。
- 是否禁用密码取决于你想对用户做什么。
- gecos 用于设置用户的全名、房间号、工作phone等。我们将它们全部设置为空白。如果你愿意,你绝对可以将它们设置为更有用的东西。
您将不得不切换到该用户,并可能使用该用户的主目录作为您的工作目录。 Dockerfile 中的行将是:
USER myusername
WORKDIR /home/myusername
我正在尝试 运行 一个带有自定义图像的 Docker 容器,给定用户。我有一个 entrypoint.sh
,它可以根据 Docker 命令行提供的环境变量更改 运行ning 用户,使用 -e USER=myuser
.
我在主机中有完全相同的用户。这可以在不同的主机上完成,我可以确保这个用户存在于我们使用的任何主机上。但我遇到了麻烦,因为我无法确保该用户的数字 ID 始终相同(比如 1001)。在 Docker 容器执行命令行中,我使用 -v <src>:<tgt>
挂载了一些本地文件夹,容器中的应用程序在 <tgt>
中创建了额外的文件夹和文件。
问题是虽然主机和容器中的用户具有相同的名称(例如 myuser
),但它的数字 ID 可以更改(例如主机中的 5000
和1001
在容器中),所以在读取挂载路径下的文件和文件夹时出现问题。
确保在执行时不仅用户名而且用户 ID 在主机和 运行ning 容器中都相同的最佳解决方案是什么?
编辑
我发现我根本没有解释自己,并且把事情搞混了。我会尝试再次解释我的问题:
我确实创建了一个基于 Linux 的镜像,在这个镜像中我:a) 安装了一组包作为
root
; b) 创建了某个用户myuser
,并在 Docker 文件中使用USER <usr>
切换到该用户;和 c) 复制我自己的软件并安装在图像中,作为用户myuser
,并且该软件必须由该用户执行。我在另一台机器上创建了完全相同的用户
myuser
在另一台机器上从此图像启动了一个容器,并从主机文件系统与该容器共享了一些文件夹(由用户
myuser
所有)。
问题的出现是因为用户 myuser
的数字 ID 在 Docker 图像中是 1001,而在其他主机中是 5000,当执行容器时。
一个解决方案是在任何主机上创建用户时都强制使用相同的数字 ID。问题是我不能确定这在 运行 图像的主机中总是可能的。
您应该使用命令 USER
在 Dockerfile 中指定用户。选项 -e USER=myuser
将创建一个环境变量,但默认情况下不会更改用户。
如果您使用的是基于 linux 的图像(例如 ubuntu),在您的 Dockerfile 中,您将需要类似
的内容sudo addgroup --gid 3000 mygroupname &&
sudo adduser --uid 4000 --gid 3000 --disabled-password --gecos "" myusername
- 我以 3000 和 4000 为例。它们可以相同 如果您希望它们成为数字。
- 是否禁用密码取决于你想对用户做什么。
- gecos 用于设置用户的全名、房间号、工作phone等。我们将它们全部设置为空白。如果你愿意,你绝对可以将它们设置为更有用的东西。
您将不得不切换到该用户,并可能使用该用户的主目录作为您的工作目录。 Dockerfile 中的行将是:
USER myusername
WORKDIR /home/myusername