主机卷:对于一个主机卷,在您的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
文件包含以下内容:
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
和
/data/a
,然后在第二个容器中挂载
/data
,则您将无法在第二个容器中看到
/data/a
,只有
/data
的内容会在那里,包括任何已经被覆盖的文件夹。
test-vol
与testvol
。 - ᴠɪɴᴄᴇɴᴛdocker run -it --rm -v testvol_data:/data busybox find /data
如何工作,因为 'busybox' 可能不包含/data
目录,它只是一个带有实用程序的基础镜像。你是在docker-compose up
之后运行这个命令而不是之前吗? - ᴠɪɴᴄᴇɴᴛtestvol
是组合项目名称,而test-vol
是图像名称。这两个都不是很重要。我在可以在我的笔记本电脑上清理的东西的名称中使用test
。第二个示例有效,请在您自己的环境中运行它。卷挂载会在容器文件系统内创建目录,在docker diff
中可以看到。 - BMitch