Docker userns-remap无法写入已挂载的目录

时间:2018-03-28 15:34:17

标签: docker namespaces

我正在尝试Docker的userns-remap功能,以root用户身份在容器内创建文件,并在主机上将此文件的所有者设为test用户。

我已将以下内容添加到/etc/docker/daemon.json

{
  "userns-remap": "test:test"
}

重映射似乎是基于守护程序日志

进行的
User namespaces: ID ranges will be mapped to subuid/subgid ranges of: test:test

并且条目test:100000:65536test:100000:65536已分别添加到/etc/subuid/etc/subgid/个文件中。

但是当我启动容器并尝试在工作目录中创建文件时,它会失败

test@box:~$ docker run -v /home/test/tmp:/somedir -w /somedir -it ubuntu:16.04 /bin/bash
root@11ff6c42ffe1:/somedir# touch file.txt
touch: cannot touch 'file.txt': Permission denied

root@11ff6c42ffe1:/somedir# ls -l
total 0
-rw-rw-r-- 1 nobody nogroup 0 Mar 23 21:39 already_existing_file.txt

root@11ff6c42ffe1:/somedir# id root
uid=0(root) gid=0(root) groups=0(root)

root@11ff6c42ffe1:/somedir# touch /file.txt

在未从主机挂载的某个其他目录中创建文件按预期工作。

此外,如果在主机上为已安装目录授予777权限(在本例中为 / home / test / tmp ),则可以从容器内成功创建文件。但是,新创建的文件在主机上具有以下权限:

ls -l /home/test/tmp
total 0
-rw-r--r-- 1 165536 165536 0 march 29 01:36 file.txt 

/ etc / passwd中没有id为165536的用户,这使我们回到起点。我希望容器中的 root 用户具有与主机上 test 用户相同的权限,以及 root 用户创建的文件在容器中拥有主机上的所有者,使用userns-remap映射,即测试

docs中说明了

  

...如果从主机挂载卷,则必须是文件所有权   预先安排的需要读取或写入卷内容。

     

......一个值得注意的限制是无法使用mknod命令。   运行时,在容器内创建设备时拒绝权限   由root用户。

这是否意味着容器内的 root 用户无法在已安装目录中创建文件/目录,即使已安装目录的所有者是 root 映射的用户使用userns-remap,在这种情况下测试

如何让工作目录也可以由容器内的用户写入?

Docker版本:18.03.0
Ubuntu版:16.04.1
内核版本:4.13.0-36-generic

重现的步骤

sudo adduser test
sudo usermod -aG docker test
sudo echo '{ "userns-remap": "test"}' >> /etc/docker/daemon.json
service docker restart
su - test
mkdir tmp
docker run -v /home/test/tmp:/somedir ubuntu:16.04 touch /somedir/file.txt

以下是一些类似的问题,但不完全相同,因为我希望在没有修改Dockerfile的情况下使其工作

1 个答案:

答案 0 :(得分:3)

要回答您的问题,最好的方法是使用'用户名称空间' docker引擎的功能。

这是一个如何使用的例子。 我们假设您的主机用户为myuser且标识为3000

myuser:3000:65536添加到 / etc / subuid / etc / subgid 文件

使用以下命令更新/etc/docker/daemon.json:

{
  "userns-remap": "myuser"
} 
不要忘记重新启动docker引擎:)

就是这样,属于您的myuser本地帐户的所有文件都属于身份0是您的容器,相反的情况也是如此。

这可以帮助您解决问题。

让我知道