我正在尝试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:65536
和test: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的情况下使其工作:
答案 0 :(得分:3)
要回答您的问题,最好的方法是使用'用户名称空间' docker引擎的功能。
这是一个如何使用的例子。
我们假设您的主机用户为myuser
且标识为3000
将myuser:3000:65536
添加到 / etc / subuid 和 / etc / subgid 文件
使用以下命令更新/etc/docker/daemon.json:
{
"userns-remap": "myuser"
}
不要忘记重新启动docker引擎:)
就是这样,属于您的myuser
本地帐户的所有文件都属于身份0
是您的容器,相反的情况也是如此。
这可以帮助您解决问题。
让我知道