gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:35:04 29 4
gpt4 key购买 nike

这篇文章有点长,但请耐心等待......

假设您有一个应用程序位于本地(主机)文件系统的 /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)挂载和卷)运行容器

现在,假设我们想使用 both 一个名为 data命名卷 挂载到 /opt/app/foo 和一个 bind-mount 用于将 /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

正如在各种帖子(如 thisthis )中所述,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

最佳答案

最后,在 github 用户 cpuguy83 的大力帮助下,我弄清楚了当我们尝试运行一个使用多个不同类型的挂载(例如 bind-mountvolume 的容器时,docker 引擎实际上做了什么) 例如:

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

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

  1. 首先,它在主机文件系统 (...data/) 中创建一个新的存储空间(即卷),供容器持久保存文件,然后(因为新创建的卷为空)它copies容器的文件(即 /opt/app/foo/* 中的任何内容)到卷的存储位置 (...data/)

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

因此,因此,当我们在示例中运行带有挂载的容器时,docker first 会将 file-c1 复制到 。 .. data/ 在主机文件系统中的位置和 second 它将首先将主机的 /app 的内容挂载到容器的 /opt/app 然后宿主机的...data/(包含file-c1)到容器的/opt/app/foo覆盖/掩盖其内容(即用 file-c1 覆盖 file-h1)。因此,如果我们在挂载完成后查看正在运行的容器内部,结果将如下所示:

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

关于docker - docker 如何处理多种挂载类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795937/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com