【问题标题】:Problem with the User and Group inside a container容器内的用户和组问题
【发布时间】:2020-10-12 04:36:12
【问题描述】:

初步

首先,初步。当运行一个卷映射到宿主机的某个部分的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

然后:

CASE 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) 不存在,这会导致很多问题。

为了解决这个问题我试过了

CASE2我用

运行容器
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,因此创建失败。

有什么好的方法可以防止所有这些问题,并且能够使主机中的用户与容器中的用户同步?

【问题讨论】:

  • 您的主机用户需要直接编辑由容器进程管理的数据文件的用例是什么?在容器中运行交互式 shell 的异常情况下,“我没有名字”消息应该主要是一个外观问题。

标签: docker uid


【解决方案1】:

我最近发现了fixuid,它可以解决你们大多数的问题。

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

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

例如:

主机:uid/gid/name=1001/1001/kansai
访客用户:uid/gid/name=1000/1000/user

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

docker run --rm -it -u $(id -u):$(id -g) -v /a/path:/another/path image fixuid /bin/bash

您也可以在入口点中设置fixuid,这样会更容易使用。

【讨论】:

  • 感谢您的回复!实际上,构建映像的人确实在入口点中包含了 fixuid,但我得到了“fixuid:已在此系统上运行;不会尝试更改 UID/GID”错误。我在stackoverflow.com/questions/64313676/… 中写了一个关于这个的问题
猜你喜欢
  • 2020-02-10
  • 2014-05-22
  • 2013-01-28
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多