问题描述
初步
首先是初步的。运行具有映射到主机某个部分的卷的docker容器时,docker容器内的用户通常是root用户,因此对于由该容器生成的文件,主机无法编辑,修改或删除它们。为了解决这个问题,有些人(包括创建我正在使用的图像的人)建议使用-u
情况
问题
当主机计算机的唯一用户(用户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 -u
和id -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
,以便于使用。