这篇文章有点冗长,但请耐心等待... 假设您有一个应用程序位于 /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
到现在为止还挺好... 运行多个装载(绑定(bind)装载和卷)的容器 现在,假设我们要使用 两者 命名卷 叫 data 安装在 /opt/app/foo 和一个 绑定(bind)安装用于安装 /app 至 /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 和 this )中所述,docker 安装按字典顺序执行(即最短路径优先)。据此,我希望 docker 首先执行绑定(bind)安装( -v /app:/opt/app ),然后是卷( -v data:/opt/app/foo )。 因此,我希望主机的内容 /app 将替换/模糊容器 /opt/app 的内容因此 file-h1 在里面 /opt/app/foo .最后,file-h1 将是 copied在新创建的 data 卷,该卷将安装在 /opt/app/foo 上(所以 file-h1 应该显示而不是 file-c1 ) 我试图理解时提出的问题 this回答 SO
Best Answer-推荐答案
最后,在 github 用户 cpuguy83 的大量帮助下,我弄清楚了当我们尝试运行使用多个不同类型挂载的容器(例如 绑定(bind)挂载 和 卷 507x2)时,docker 引擎实际上做了什么例如:
docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app
这里要理解的重点是docker在中的进程中的两个步骤是按照以下顺序执行的: 首先,它在主机文件系统( ... data/ )中为容器创建一个新的存储空间(即卷)来持久化文件,然后(因为新创建的卷是空的)它 copies 容器的文件(即 /opt/app/foo/* 中的任何内容)到卷的存储位置(... data/ ) 然后,它按照字典顺序执行所有挂载(绑定(bind)、卷、tmpfs 挂载等......都集中在一起)(首先挂载 /app 到 /opt/app 然后 ... data/ 到 /opt/app/foo ) 因此,因此,当我们在示例中使用挂载运行容器时,docker 第一个 会将 file-c1 复制到主机文件系统中的 ... data/ 位置,然后 将第二个 _0x104567 的内容首先挂载到主机容器的 /app 和主机的 /opt/app (包含 ... data/ )到容器的 file-c1 覆盖/遮蔽其内容(即用 /opt/app/foo 覆盖 file-h1 )。因此,如果我们在挂载完成后查看正在运行的容器内部,结果将如下所示:
opt
|-- app
| |-- index.php
| |-- foo
| | `-- file-c1
| `-- bar
| `-- file-h2
关于docker - docker 如何处理多种挂载类型?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/47795937/
|