Смешивание названных томов и привязка монтирования в Docker?

Как работает слияние томов и привязок? Используя следующую настройку, пути, которые будут привязаны к связыванию, все еще доступны внутри привязки, как они существуют в монтировании привязки? /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"

2 ответа

Тома хоста: для тома хоста, определенного с помощью пути в вашем файле docker, выполните следующие действия:

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

Это обеспечит свойства инициализации именованного тома. Когда ваш каталог хоста пуст, на докере создания контейнера будет скопировано содержимое изображения в /var/www/html/wp-content/uploads в /path/on/host/to/wordpress/uploads.

Вложенные подставки с 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

И докер скопировал это в файловую систему хоста:

$ 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 будут там, включая любые папки, которые были установлены поверх.


Я считаю, что ответ заключается в настройке распространения связывания.

будет отчитываться.

Изменить. Кажется, что вы можете настраивать распространение связывания только на подключенных томах и только на хост-системе Linux.

licensed under cc by-sa 3.0 with attribution.