混合命名卷并在Docker中绑定挂载?

Pea*_*ger 9 docker docker-compose docker-stack

混合命名卷和绑定挂载如何工作?使用以下安装程序,绑定安装中的路径是否仍将存在于绑定安装中,就像绑定安装中存在的路径一样? /var/www/html/wp-content/uploads

使用我附加到命名卷的单独容器,似乎表明情况并非如此,因为从单独容器的角度来看,这些路径是完全空的。有某种方法可以在某种意义上起作用吗?

volumes: - "wordpress:/var/www/html" - "./wordpress/uploads:/var/www/html/wp-content/uploads" - "./wordpress/plugins:/var/www/html/wp-content/plugins" - "./wordpress/themes:/var/www/html/wp-content/themes"

BMi*_*tch 10

主机卷:对于主机卷,在docker撰写文件中使用路径定义,例如:

volumes:
  - "./wordpress/uploads:/var/www/html/wp-content/uploads"
Run Code Online (Sandbox Code Playgroud)

您将不会从映像内容中收到主机目录的任何初始化。这是设计使然。


命名卷:您可以定义一个映射回本地目录的命名卷:

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
Run Code Online (Sandbox Code Playgroud)

这将提供命名卷的初始化属性。当您的主机目录为空时,泊坞窗将在容器创建时将/ 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
Run Code Online (Sandbox Code Playgroud)

Dockerfile包含:

FROM busybox
COPY data-image/ /data
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

命名卷已初始化:

$ docker run -it --rm -v testvol_data:/data busybox find /data
/data
/data/sub-dir
/data/sub-dir/from-named-vol
Run Code Online (Sandbox Code Playgroud)

运行测试显示副本来了,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
Run Code Online (Sandbox Code Playgroud)

docker已将其复制到主机文件系统:

$ ls -l data-submount/
total 0
-rw-r--r-- 1 root root 0 Jan 15 08:08 from-image
Run Code Online (Sandbox Code Playgroud)

Linux中的嵌套挂载:从您的问题出发,对于挂载本身在Linux中的工作方式似乎有些困惑。每个卷安装都在容器的安装名称空间中运行。该名称空间为容器提供了自己的文件系统树视图。将卷装载到该树中时,您无需修改​​父文件系统中的内容,它只是掩盖了该位置中父文件的内容。所有更改都直接在该新安装的目录中发生,如果要卸载它,则父目录将以其原始状态可见。

因此,如果将两个嵌套目录装入一个容器(例如/data和)/data/a,然后装入/data第二个容器,则在第二个容器/data/a的第一个容器中将看不到,只有其中的内容/data存在,包括已装入的所有文件夹在上面。