我正在尝试Docker的用户-重新映射特性,以便以root用户的身份在容器中创建一个文件,并在主机上将该文件的所有者作为test用户。
我在/etc/docker/daemon.json中添加了以下内容
{
"userns-remap": "test:test"
}重映射似乎是基于守护进程日志进行的。
User namespaces: ID ranges will be mapped to subuid/subgid ranges of: test:testtest:100000:65536和test:100000:65536分别添加到/etc/subuid和/etc/subgid/文件中。
但是,当我启动一个容器并尝试在working中创建一个文件时,它会失败。
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 id 165536的用户不在/etc/passwd中,这使我们回到了起点。我希望容器中的根用户具有与主机上的测试用户相同的权限,并且容器中的根用户创建的文件在主机上拥有使用userns-remap映射的所有者,即测试。
在文档中指出,
...if卷是从主机挂载的,文件所有权必须预先安排,需要对卷内容进行读写访问。 ..。一个值得注意的限制是无法使用mknod命令。当根用户运行时,拒绝在容器内创建设备的权限。
这是否意味着容器中的root用户不能在挂载目录中创建文件/目录,即使挂载目录的所有者是root映射到使用userns-remap的用户,在本例中是测试。
有什么想法吗?如何使工作目录也可由用户在容器内写?
码头版本:18.03.0
Ubuntu版本:16.04.1
内核版本:4.13.0-36-泛型
复制步骤
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的情况下完成这项工作:
发布于 2018-04-01 16:18:27
要回答您的问题,最好的方法是使用停靠引擎的“用户名称空间”特性。
下面是一个如何使用的示例。假设您的主机用户是myuser和id 3000
将myuser:3000:65536添加到/etc/subuid和/etc/subgid文件中
使用以下内容更新/etc/docker/daemon.json:
{
"userns-remap": "myuser"
} 不要忘记重新启动你的对接引擎:)
就是这样,属于您的myuser本地帐户的所有文件都属于id 0,它是您的容器,而相反的文件也是正确的。
这应该能帮你解决问题。
让我知道
https://stackoverflow.com/questions/49538616
复制相似问题