这篇文章有点长,但请耐心等待一段时间......
假设您有一个应用程序位于/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