首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker用户-重新映射不能写入已挂载的目录

Docker用户-重新映射不能写入已挂载的目录
EN

Stack Overflow用户
提问于 2018-03-28 15:34:16
回答 1查看 3.7K关注 0票数 9

我正在尝试Docker的用户-重新映射特性,以便以root用户的身份在容器中创建一个文件,并在主机上将该文件的所有者作为test用户。

我在/etc/docker/daemon.json中添加了以下内容

代码语言:javascript
复制
{
  "userns-remap": "test:test"
}

重映射似乎是基于守护进程日志进行的。

代码语言:javascript
复制
User namespaces: ID ranges will be mapped to subuid/subgid ranges of: test:test

test:100000:65536test:100000:65536分别添加到/etc/subuid/etc/subgid/文件中。

但是,当我启动一个容器并尝试在working中创建一个文件时,它会失败。

代码语言:javascript
复制
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 ),则可以在容器内成功创建文件。但是,新创建的文件在主机上具有以下权限:

代码语言:javascript
复制
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-泛型

复制步骤

代码语言:javascript
复制
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的情况下完成这项工作:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-01 16:18:27

要回答您的问题,最好的方法是使用停靠引擎的“用户名称空间”特性。

下面是一个如何使用的示例。假设您的主机用户是myuser和id 3000

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

使用以下内容更新/etc/docker/daemon.json:

代码语言:javascript
复制
{
  "userns-remap": "myuser"
} 

不要忘记重新启动你的对接引擎:)

就是这样,属于您的myuser本地帐户的所有文件都属于id 0,它是您的容器,而相反的文件也是正确的。

这应该能帮你解决问题。

让我知道

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49538616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档