容器内的用户和组存在问题

问题描述

初步

首先是初步的。运行具有映射到主机某个部分的卷的docker容器时,docker容器内的用户通常是root用户,因此对于由该容器生成文件,主机无法编辑,修改删除它们。为了解决这个问题,有些人(包括创建我正在使用的图像的人)建议使用-u

情况

我有一个Docker映像(由另一个人在另一台计算机上构建)

此Docker映像假定用户将是ID为1000的用户

问题

当主机计算机的唯一用户用户ID为1000)运行该映像时,没有问题。但是,就我而言,我是该主机的第二个用户,所以我的用户ID为1001。

在主持人中,我做cat /etc/passwd,并得到几个用户包括

firstuser:x:1000:1000:firstluser,:/home/firstuser:/bin/bash

myself:x:1001:1001:My Name,:/home/myself:/bin/bash

然后:

案例1 我使用以下容器运行容器

docker run -it --rm -u 1001:1001  -v /a/path:/another/path image  /bin/bash

因为做id -uid -g会给我1001。(我毕竟是第二个用户

这样做会导致

groups:cannot find name for group ID 1001

然后我的用户变成"I have no name!",当我做cat/etc/passwd时我得到

originaluser:x:1000:1000::/home/originaluser:bin/bash

显然,我的用户(1001)不存在,这导致了很多问题。

解决这个问题,我尝试了

案例2 我使用以下容器运行容器

docker run -it --rm -u 1000:1000  -v /a/path:/another/path image  /bin/bash

这不会导致先前的错误,并且即使我是myself但现在以firstuser的身份运行Docker映像,在我是originaluser的容器中(因为两者都是1000)

做我能看到的cat /etc/passwd

originaluser:x:1000:1000::/home/sensetime:bin/bash

并且正如我所预测的,我的用户originaluser

我应该很高兴,但这也会引起问题!

稍后容器中的程序尝试创建文件用户1000),但由于已映射并且用户所有者为1001,因此创建失败。

什么是预防所有这些问题并能够使主机中的用户与容器中的用户同步的好方法

解决方法

我最近发现fixuid可以解决您的大多数问题。

容器中的uid / gid无法(或不希望与主机上的uid / gid匹配)。

我上面链接的revalidate setuid go二进制文件可以通过在docker中更改用户的uid / gid以匹配您配置的uid / gid来解决此问题。

例如:

主机:uid / gid / name = 1001/1001 / kansai
来宾用户:uid / gid / name = 1000/1000 / user

如果您已经在容器中添加了fixuid二进制文件(构建阶段),则可以运行:

fixuid

您还可以在入口点设置docker run --rm -it -u $(id -u):$(id -g) -v /a/path:/another/path image fixuid /bin/bash ,以便于使用。