主机上的Docker新用户,如何通知Docker?

时间:2019-06-09 01:26:34

标签: docker

我在具有特定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

最终可行的方法是更改​​父文件夹的所有者。

2 个答案:

答案 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且用户名相同的uid10002)用户。 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_user1container_user1的文件权限

在容器中,以用户container_user1

 su container-user1    
 echo aa >> /vol1/afile.txt

在主机上,与用户host_user1写入同一文件

 su host_user1
 echo bb >> /vol1/afile.txt

如果您处在这种情况下,则应该立即使用。 希望对您有所帮助。