docker 如何处理多种挂载类型?

2024-01-09

这篇文章有点长,但请耐心等待一段时间......

假设您有一个应用程序位于/app在具有以下结构的本地(主机)文件系统中

app
|-- index.php
|-- foo
|   `-- file-h1
`-- bar
    `-- file-h2

现在假设我们有一张图像(标记为myrepo/app)利用以下数据结构

opt
|-- app
|   `-- foo
|       `-- file-c1

如果我们通过安装主机的镜像来运行容器/app到容器的/opt/app如下

docker container run \
-v /app:/opt/app \
myrepo/app

容器的最终数据结构如下

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-h1          
|   `-- bar
|       `-- file-h2 

到目前为止,一切都很好...

运行具有多个挂载的容器(绑定挂载和卷)

现在,假设我们要使用both a 命名卷 called data要安装在/opt/app/foo and a 绑定安装用于安装/app to /opt/app

docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app

容器内生成的数据结构将是:

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-c1          
|   `-- bar
|       `-- file-h2 

正如各种帖子中所述(例如this https://github.com/moby/moby/issues/26051#issuecomment-242847347 and this https://github.com/moby/moby/issues/19120#issuecomment-169330570)docker 挂载按字典顺序执行(即最短路径优先)。据此,我希望docker首先执行bind-mount( -v /app:/opt/app),然后是音量(-v data:/opt/app/foo).

因此,我会expect主机的内容/app会替换/掩盖容器的内容/opt/app因此file-h1在里面/opt/app/foo。最后,file-h1将会copied https://docs.docker.com/engine/admin/volumes/#tips-for-using-bind-mounts-or-volumes在新创建的data卷和卷将安装在/opt/app/foo (so file-h1应该显示而不是file-c1 )

当我试图理解时我提出的问题this https://stackoverflow.com/a/38601156/2235814回答SO


最后,在 github 用户的大力帮助下cpuguy83 https://github.com/moby/moby/issues/19120#issuecomment-352450375, 我想通了当我们尝试运行一个使用不同类型的多个挂载的容器时,docker 引擎实际上做了什么(例如,两个绑定安装 and a volume)例如:

docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app

这里要理解的关键点是docker执行的进程是在两步按以下顺序完成:

  1. 首先,它在主机文件系统中创建一个新的存储空间(即卷)(... data/)让容器保存文件,然后(因为新创建的卷是空的)copies https://docs.docker.com/engine/admin/volumes/#good-use-cases-for-tmpfs-mounts容器的文件(即里面的任何内容/opt/app/foo/*)到卷的存储位置(... data/)

  2. 然后,它按照字典顺序执行所有挂载(绑定、卷、tmpfs 挂载等...都集中在一起)(第一个挂载/app to /opt/app then ... data/ to /opt/app/foo)

因此,正因为如此,当我们在示例中运行带有挂载的容器时,dockerfirst将复制file-c1 to the ... data/主机文件系统中的位置和second它将首先安装主机的内容/app到容器的/opt/app然后是主持人的... data/(其中包含file-c1) 到容器的/opt/app/foo覆盖/模糊其内容(即覆盖file-h1 with file-c1)。因此,如果我们在安装完成后查看正在运行的容器内部,结果将如下:

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

docker 如何处理多种挂载类型? 的相关文章

随机推荐

  • ORA-06508: PL/SQL: 找不到正在调用的程序单元

    我使用的是 oracle 10g 和 toad 11 5 我正在尝试从匿名块调用 api 如果我添加后重新编译apidbms output put line然后尝试执行匿名块 它显示错误为 ORA 06508 PL SQL could no
  • 为什么要在 HTML 标签中添加 ID?

    一个简单的问题 为什么我们要添加id如果没有它们 我们的 HTML 标签也能正常工作吗 我知道它们的用途之一是能够通过主题标签浏览页面 但是它们还有其他用途吗 Uses of idHTML 中的属性 作为 URL 上片段标识符的目标 作为表
  • 为什么对于小元素列表,插入排序比快速排序更好?

    Isn t 插入排序 O n 2 gt 快速排序 O n log n 那么对于小n 关系不是一样吗 Big O 表示法描述了 n 很大时的极限行为 也称为渐近行为 这是一个近似值 看http en wikipedia org wiki Bi
  • 如何正确使用addResourcePath?

    我想更改shiny 获取图像的目录 我需要将带有 logo jpg 的 www 文件夹放入另一个名为 extra files 的文件夹中 作为我的家庭作业任务的要求 我已阅读文档 但我不明白它 因为这是我的第一个 R 项目 如何选择前缀和目
  • 使用 Spark 从 Azure Blob 读取数据

    我在通过 Spark Streaming 从 azure blob 读取数据时遇到问题 JavaDStream
  • 测试/调试/修复 PHP 并发问题的工具?

    我发现自己在 PHP 中使用 memcached 做了一些相对高级的事情 思考和解决由缓存的无锁特性引起的竞争条件和并发问题正在成为一场精神斗争 当涉及到并发性 线程 有人吗 时 PHP 的工具似乎相当差 所以我想知道是否有任何解决方案可以
  • 以编程方式安装位于 /res/raw 中的 .apk 文件

    我已在 res raw 目录中存储了另一个应用程序的 apk 文件 并希望提示用户安装它 这是我当前的代码 Intent intent new Intent Intent ACTION VIEW intent setDataAndType
  • Excel 中从命名列表进行区分大小写的验证

    我在 Excel 2003 中使用 VBA 来应用验证 以将验证应用于命名列表中给定的单元格范围 然后 用户可以从值的下拉列表中进行选择 编辑 这是我设置验证的方式 给定一个名为 MyLookupList 的命名范围 With valida
  • 使用 applescript 打开程序

    2部分问题 我只是想从终端使用 applescript 运行程序 所以我尝试了 osascript tell application iTunes to activate 并得到错误 osascript tell No such file
  • C99 保证数组是连续的吗?

    继另一个问题中的热门评论之后 我开始讨论 C99 标准中关于 C 数组的定义和未定义的内容 基本上当我定义一个二维数组时int a 5 5 标准 C99 是否保证它将是一个连续的整数块 我可以将其转换为 int a并确保我将拥有一个包含 2
  • 如何为工具栏溢出菜单图标设置动画

    有没有办法为工具栏上默认的 3 垂直点菜单图标设置动画 我使用工具栏作为操作栏 并使用标准代码 Toolbar toolbar Toolbar findViewById R id toolbar setSupportActionBar to
  • 将工件部署到 Nexus 3 所需的最低权限集是什么?

    我正在使用 Nexus Repository Manager 3 1 0 04 并且我想创建一个仅具有部署权限的用户 为此所需的最低权限是什么 现在我创建了一个角色nx deploy具有以下特权 nx 存储库 管理 read nx 存储库
  • 关于Java线程和进程优先级的一些问题

    我有一个关于线程的小问题 在 Unix 系统上 我们有nice 可用于设置优先级 流程 好的 在我的系统上 我调用了一些外部进程 但是 我想 为他们设定优先级 在unix中 我可以调用其他ProcessBuilder并将nice设置为 我想
  • 如何在 Visual Studio 2017 / 2019 中获取终端窗口?

    我刚刚读了这篇文章 https devblogs microsoft com dotnet visual studio 2019 net productivity 2 https devblogs microsoft com dotnet
  • 1.13 动态添加js对象到model数组

    我有以下代码 var msg this store createRecord text first title createdAt 2015 06 22T20 06 06 03 00 this get model content pushO
  • “候选版本”应该是不可变的吗?

    如果我们有一个源代码控制分支 用于停止功能和错误测试 包括在该分支上进行额外提交以修复所述错误 那么它应该被称为什么 释放候选人 合适吗 我的想法是 这样的分支将被称为 发布 并且使用 候选 一词意味着它是不可变的 你可以有候选人 1 和候
  • mathematica 中的 2 列文档

    Mathematica 可以用来编写非常好的文档 有谁知道是否可以写两栏的文档 如果是这样 您能否提供一些示例或显示这种风格的其他笔记本的链接 我认为 Mathematica 不支持任何好的多列实现 它与笔记本界面的结构并不真正兼容 pub
  • IndexOutOfRangeException 深入 NHibernate 的内部

    我有以下映射 public class SecurityMap ClassMap
  • 如何修复 Mongo 中的 retryWrites?

    我正在使用 mlab com mongoDB 我可以查询它 但无法插入它 这就是我的班级 public class Main private MongoUrl url private MongoClient client public Ma
  • docker 如何处理多种挂载类型?

    这篇文章有点长 但请耐心等待一段时间 假设您有一个应用程序位于 app在具有以下结构的本地 主机 文件系统中 app index php foo file h1 bar file h2 现在假设我们有一张图像 标记为myrepo app 利