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

ira*_*ira 7 docker docker-compose

这个帖子有点lenglthy但是我忍受了一段时间......

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

app
|-- index.php
|-- foo
|   `-- file-h1
`-- bar
    `-- file-h2
Run Code Online (Sandbox Code Playgroud)

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

opt
|-- app
|   `-- foo
|       `-- file-c1
Run Code Online (Sandbox Code Playgroud)

如果我们通过将主机安装/app到容器来运行该映像中的容器/opt/app,如下所示

docker container run \
-v /app:/opt/app \
myrepo/app
Run Code Online (Sandbox Code Playgroud)

容器的结果数据结构如下

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-h1          
|   `-- bar
|       `-- file-h2 
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好...

运行具有多个安装的容器(绑定安装和卷)

现在,让我们说,我们想用这两个一个名为容积称为data被安装在/opt/app/vendor绑定贴装安装/app/opt/app

docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app
Run Code Online (Sandbox Code Playgroud)

容器内部的结果数据结构将是:

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-c1          
|   `-- bar
|       `-- file-h2 
Run Code Online (Sandbox Code Playgroud)

正如在各种帖子(如此此类)中所述,码头支架以字典顺序执行(即,首先是最短路径).根据这个,我希望docker首先执行bind-mount(-v /app:/opt/app)然后执行volume(-v data:/opt/app/foo).

因此,我希望主机的内容/app会替换/隐藏容器的内容,/opt/app从而file-h1进入内部/opt/app/foo.最后,file-h1将被复制到新创建的data卷中并且卷将被挂载/opt/app/foo(因此file-h1应该显示而不是file-c1)

当我试图在SO上理解这个答案时,我提出了一些问题

ira*_*ira 12

最后,在github用户cpuguy83的帮助下,我想出了当我们尝试运行一个使用多个不同类型的挂载(例如绑定挂载)的容器时,实际上docker 引擎的作用,例如:

docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app
Run Code Online (Sandbox Code Playgroud)

这里要理解的关键点是docker按以下顺序执行两个步骤:

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

  2. 然后在这之后,它执行在词典顺序所有挂载(结合,卷,TMPFS固定座,等等都集中在一起)(第一安装/app/opt/app然后... data//opt/app/foo)

所以,正因为如此,当我们在我们的例子中,坐骑运行容器,泊坞窗首先将复制file-c1... data/位置,在主机文件系统和第二它会首先安装主机的内容/app到容器的/opt/app,然后主机的... data/(这包含file-c1)到容器的/opt/app/foo覆盖/模糊的内容(即覆盖file-h1file-c1).因此,如果我们在安装完成后查看正在运行的容器内部,结果将如下所示:

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-c1          
|   `-- bar
|       `-- file-h2
Run Code Online (Sandbox Code Playgroud)

  • 这是一个令人难以置信的具体问题,我正要问 SO,然后我遇到了你的问题,它准确地解释了我正在寻找的东西!我注意到完全相同的行为,但不知道为什么。非常感谢! (3认同)