Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据?

2024-05-15

在 Docker 中,在容器内创建的文件在从主机检查它们时往往具有不可预测的所有权。默认情况下,卷上文件的所有者是 root (uid 0),但一旦非 root 用户帐户参与容器并写入文件系统,从主机的角度来看,所有者或多或少会变得随机。

当您需要使用调用 docker 命令的同一用户帐户从主机访问卷数据时,这是一个问题。

典型的解决方法是

  • 在 Dockerfiles 中创建时强制用户 uID(不可移植)
  • 将主机用户的 UID 传递给docker run命令作为环境变量,然后运行一些chown入口点脚本中对卷的命令。

这两种解决方案都可以对容器外部的实际权限进行一些控制。

我希望用户命名空间是这个问题的最终解决方案。我使用最近发布的 1.10 版本运行了一些测试,并将 --userns-remap 设置为我的桌面帐户。但是,我不确定它是否可以使已安装卷上的文件所有权更容易处理,恐怕实际上可能恰恰相反。

假设我启动这个基本容器

docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit

然后检查主机的内容:

ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/

-rw-r--r-- 1 100000 100000 6 Feb  8 19:43 test.txt

这个数字“100000”是我的主机用户的子UID,但由于它与我的用户的UID不对应,所以我仍然无法在没有权限的情况下编辑test.txt。这个子用户似乎与我在 docker 之外的实际常规用户没有任何亲和力。它没有映射回来。

本文前面提到的解决方法(包括在主机和容器之间对齐 UID)不再起作用,因为UID->sub-UID命名空间中发生的映射。

那么,有没有一种方法可以在启用用户命名空间的情况下运行 docker(以提高安全性),同时仍然允许运行 docker 的主机用户拥有在卷上生成的文件?


如果您可以提前预先安排用户和组,那么就可以以这种特定的方式分配 UID 和 GID,以便主机用户与容器内的命名空间用户相对应。

这是一个示例(Ubuntu 14.04,Docker 1.10):

  1. 创建一些具有固定数字 ID 的用户:

    useradd -u 5000 ns1
    
    groupadd -g 500000 ns1-root
    groupadd -g 501000 ns1-user1
    
    useradd -u 500000 -g ns1-root ns1-root
    useradd -u 501000 -g ns1-user1 ns1-user1 -m
    
  2. 手动编辑自动生成的从属 ID 范围/etc/subuid and /etc/subgid files:

    ns1:500000:65536
    

    (注意没有记录ns1-root and ns1-user1 due to MAX_UID and MAX_GID限制在/etc/login.defs)

  3. 启用用户命名空间/etc/default/docker:

    DOCKER_OPTS="--userns-remap=ns1"
    

    重新启动守护进程service docker restart, 确保/var/lib/docker/500000.500000目录已创建。

    现在,在容器内你有root and user1,并在主机上--ns1-root and ns1-user1,具有匹配的 ID

    UPDATE:为了保证非 root 用户在容器中拥有固定的 ID(例如 user1 1000:1000),请在镜像构建期间显式创建它们。

试驾:

  1. 准备卷目录

    mkdir /vol1
    chown ns1-root:ns1-root /vol1
    
  2. 从容器中尝试一下

    docker run --rm -ti -v /vol1:/vol1 busybox sh
    echo "Hello from container" > /vol1/file
    exit
    
  3. 楼主试试

    passwd ns1-root
    login ns1-root
    cat /vol1/file
    echo "can write" >> /vol1/file
    

不便携,看起来像黑客,但可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据? 的相关文章

随机推荐

  • Xcode 在代码签名身份中看不到我的开发人员证书

    我续订了 IOS 开发人员证书 从钥匙串中删除了旧证书 然后单击了我的证书 钥匙串中的一切看起来都很正常 我有分发 开发人员 WWDC 证书 每个配置文件看起来都有效 并带有绿色标记 在组织器中的团队和配置文件部分下 但在代码签名身份下的
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 将应用程序登录凭据发送给 AppStore 审核者

    我刚刚将我的应用程序上传到应用程序商店 该应用程序需要用户名 密码才能登录 但在上传过程中从未提示我输入任何凭据 有谁知道我如何向审阅者发送我的凭据 而不必等待他们审阅并请求凭据 您编辑应用程序元数据 标题 描述 关键字等 的页面最底部字段
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • Laravel 意外错误“类用户包含 3 个抽象方法...”

    在 Laravel 上编写我的身份验证应用程序时 我遇到了一个以前从未见过的错误 我已经集思广益了近一个小时来解决这个问题的原因 但仍然找不到解决方案 Error User 类包含 3 个抽象方法 因此必须声明为抽象方法或实现其余方法 Il
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • Coldfusion CreateDate 问题

    我遇到了一些麻烦CreateDate 函数 它只是出错 我不知道为什么 我正在运行此查询以获取新闻报道中的所有日期 以便我可以每月创建一个新闻档案
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 计算 pyspark df 列中子字符串列表的出现次数

    我想计算子字符串列表的出现次数 并根据 pyspark df 中包含长字符串的列创建一个列 Input ID History 1 USA UK IND DEN MAL SWE AUS 2 USA UK PAK NOR 3 NOR NZE 4
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据?

    在 Docker 中 在容器内创建的文件在从主机检查它们时往往具有不可预测的所有权 默认情况下 卷上文件的所有者是 root uid 0 但一旦非 root 用户帐户参与容器并写入文件系统 从主机的角度来看 所有者或多或少会变得随机 当您需