我在具有特定uid的主机(Ubuntu)上创建了一个新用户,并启动了一个容器,其中有一个具有相同用户ID的用户。
然后安装一个文件夹,该文件夹在主机上具有ID的该新用户对其具有权限。然而,具有相同ID号的容器中的用户却没有它们,而我希望它们具有许可权。
结果是主机的用户不在docker进程(/ proc / ...)的组中?
所以,我需要让docker守护进程知道新用户吗?重新加载Docker守护程序?重新加载systemctl?还有吗?
编辑:
因此,假设我的procId为12345,我正在这样做:
cat /proc/12345/status
我看到了:
Name: process-inside-container
State: S (sleeping)
Tgid: 12345
Ngid: 0
Pid: 12345
PPid: 17847
TracerPid: 0
Uid: 20000 20000 20000 20000
Gid: 20000 20000 20000 20000
FDSize: 64
Groups: 145
NStgid: 12345 30
...
因此,在容器的内部和外部,我都创建了一个ID为20000的用户和组。但是,正如您从“ groups”参数中看到的那样,该进程仅识别ID为145的旧组。我的ID为20000的主机组未包括在内。因此,我想不能共享权限。
这是什么意思?
EDIT2:当我说我安装了一个文件夹时,它是通过docker run -v /data/:/data/
。
该文件夹由ID为20000(即前面提到的ID)的用户和组在主机上拥有。
由于某种原因,尽管容器中的用户和组具有相同的ID,但该用户无权编辑该文件夹。
EDIT3:我尝试ls
文件夹或其中的文件touch
,得到Permission Denied
。
最终可行的方法是更改父文件夹的所有者。
答案 0 :(得分:0)
docker容器内的用户与主机用户是分开的。如果要让docker容器中的用户的uid和gid与主机上的uid和gid相同,请在运行时按如下所示进行设置。
docker run -d --user <uid>:<gid> ubuntu:latest sleep infinity
更多信息here
答案 1 :(得分:0)
我不确定我是否完全理解您的问题,但是希望这可以使事情有所澄清。
如果在容器内部您有一个与主机上其他用户具有相同uid
的用户,则他们在安装的卷上都具有相同的权限。实际上,这意味着只有一个uid
受内核控制,但用户名可能不同(一个用于主机,另一个用于容器)
使用主机上的uid
10002
创建用户:
sudo groupadd -g 10002 host_group1
sudo useradd -r -u 10002 -g host_group1 host_user1
sudo mkdir /vol1
sudo chown -R host_user1 /vol1
创建图像并添加名称为container_user1
且用户名相同的uid
(10002
)用户。 Dockerfile
:
FROM ubuntu:latest
RUN groupadd -g 10002 container_group1
RUN useradd -r -u 10002 -g container_group1 container_user1
ENTRYPOINT ["/bin/sleep", "infinity"]
构建图像:
docker build -t my-ubuntu .
以已安装/vol1
的卷运行映像:
docker run -d -v /vol1:/vol1 --name my-ubuntu my-ubuntu
检查host_user1
和container_user1
的文件权限
在容器中,以用户container_user1
su container-user1
echo aa >> /vol1/afile.txt
在主机上,与用户host_user1
写入同一文件
su host_user1
echo bb >> /vol1/afile.txt
如果您处在这种情况下,则应该立即使用。 希望对您有所帮助。