这篇文章有点冗长,但请耐心等待...
假设您有一个应用程序位于 /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
到现在为止还挺好...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
)最后,在 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/
)/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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |