主机卷:对于主机卷,使用 docker compose 文件中的路径定义,例如:
volumes:
- "./wordpress/uploads:/var/www/html/wp-content/uploads"
您不会从图像内容中收到任何主机目录的初始化。这是设计使然。
命名卷:您可以定义映射回本地目录的命名卷:
version: "2"
services:
your-service:
volumes:
- uploads:/var/www/html/wp-content/uploads
volumes:
uploads:
driver: local
driver_opts:
type: none
o: bind
device: /path/on/host/to/wordpress/uploads
这将提供命名卷的初始化属性。当您的主机目录为空时,在创建容器时,docker 会将 /var/www/html/wp-content/uploads 中的图像内容复制到 /path/on/host/to/wordpress/uploads。
使用 Docker 进行嵌套挂载:如果您有多个嵌套卷挂载,则 docker 仍会从映像目录内容复制,而不是从父卷复制。
这是该初始化的示例。从文件系统开始:
testvol/
data-image/
sub-dir/
from-image
data-submount/
Dockerfile
docker-compose.yml
Dockerfile 包含:
FROM busybox
COPY data-image/ /data
docker-compose.yml 包含:
version: "2"
services:
test:
build: .
image: test-vol
command: find /data
volumes:
- data:/data
- subdir:/data/sub-dir
volumes:
data:
subdir:
driver: local
driver_opts:
type: none
o: bind
device: /path/on/host/test-vol/data-submount
并且命名卷已被初始化:
$ docker run -it --rm -v testvol_data:/data busybox find /data
/data
/data/sub-dir
/data/sub-dir/from-named-vol
运行测试显示副本来自from-image
而不是from-named-vol
:
$ docker-compose -f docker-compose.bind.yml up
...
Attaching to testvol_test_1
test_1 | /data
test_1 | /data/sub-dir
test_1 | /data/sub-dir/from-image
testvol_test_1 exited with code 0
并且 docker 已将其复制到主机文件系统:
$ ls -l data-submount/
total 0
-rw-r--r-- 1 root root 0 Jan 15 08:08 from-image
Linux 中的嵌套挂载:从您的问题来看,挂载本身在 Linux 中的工作方式似乎有些混乱。每个卷挂载都在容器的挂载命名空间中运行。这个命名空间为容器提供了自己的文件系统树视图。当您将卷挂载到该树中时,您不会修改父文件系统中的内容,它只是覆盖了该位置的父文件系统的内容。所有更改都直接发生在新挂载的目录中,如果您要卸载它,则父目录将以其原始状态可见。
因此,如果您在一个容器中挂载两个嵌套目录,例如/data
and /data/a
,然后/data
在第二个容器中挂载,您将不会/data/a
从第二个容器中的第一个容器中看到,只有 的内容/data
会在那里,包括任何已挂载的文件夹在上面。