Анонимные тома Docker

Я видел определения томов Docker в docker-compose.yml файлах, например:

-v /path/on/host/modules:/var/www/html/modules

Я заметил, что официальный образ Drupal, их docker-compose.yml файл использует анонимные тома.

Обратите внимание на комментарии:

volumes:
  - /var/www/html/modules
  - /var/www/html/profiles
  - /var/www/html/themes
  # this takes advantage of the feature in Docker that a new anonymous
  # volume (which is what we're creating here) will be initialized with the
  # existing content of the image at the same location
  - /var/www/html/sites

Есть ли способ связать анонимный том с путем на хост-компьютере после запуска контейнера? Если нет, то какой смысл в анонимных томах?

Полный пример docker-compose.yml:

version: '3.1'

services:

  drupal:
    image: drupal:8.2-apache
    ports:
      - 8080:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      # this takes advantage of the feature in Docker that a new anonymous
      # volume (which is what we're creating here) will be initialized with the
      # existing content of the image at the same location
      - /var/www/html/sites
    restart: always

  postgres:
    image: postgres:9.6
    environment:
      POSTGRES_PASSWORD: example
    restart: always

person Raphael Rafatpanah    schedule 07.07.2017    source источник


Ответы (3)


Добавление дополнительной информации в ответ на дополнительный вопрос/комментарий от @JeffRSon с вопросом, как анонимные тома повышают гибкость, а также в ответ на этот вопрос из OP:

Есть ли способ связать анонимный том с путем на хост-компьютере после запуска контейнера? Если нет, то какой смысл иметь анонимные тома?

TL;DR: вы можете связать конкретный анонимный том с запущенным контейнером через «контейнер данных», но это обеспечивает гибкость для покрытия варианта использования, который теперь гораздо лучше обслуживается использованием именованных томов. .

Анонимные тома были полезны до добавления управления томами в Docker 1.9. До этого у вас не было возможности назвать том. В версии 1.9 тома стали дискретными управляемыми объектами с собственным жизненным циклом.

До версии 1.9, не имея возможности назвать том, вам приходилось ссылаться на него, предварительно создавая контейнер данных.

docker create -v /data --name datacontainer mysql

а затем монтирует анонимный том контейнера данных в контейнер, которому нужен доступ к тому

docker run -d --volumes-from datacontainer --name dbinstance mysql

В наши дни лучше использовать именованные тома, так как ими гораздо проще управлять и они гораздо более явные.

person BitMask777    schedule 11.05.2018

Анонимные тома эквивалентны определению этих каталогов как VOLUME в Dockerfile образа. На самом деле каталоги, определенные как VOLUME в Dockerfile, являются анонимными томами, если они явно не сопоставлены с хостом.

Смысл их наличия в дополнительной гибкости.

PD: Анонимные тома уже находятся на хосте где-то в /var/lib/docker (или в любом другом каталоге, который вы настроили). Чтобы увидеть, где они находятся:

docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' $CONTAINER

Примечание. Замените $CONTAINER именем контейнера.

person Ricardo Branco    schedule 07.07.2017
comment
Как они добавляют гибкости? Я понимаю анонимные тома в целом, но я не понимаю их использование, так как каждый запуск докера создает новый том. - person JeffRSon; 28.04.2018
comment
@JeffRSon: Вы нашли ответ на свой вопрос? Каково законное и полезное использование анонимных томов? - person cherouvim; 03.02.2021

Один из возможных вариантов использования анонимных томов в наши дни — в сочетании с Bind Mounts. Когда вы хотите привязать какую-то папку, но без каких-либо конкретных подпапок. Затем эти конкретные подпапки должны быть установлены как именованные или анонимные тома. Это гарантирует, что эти подпапки будут присутствовать в вашей папке контейнера, которая ограничена за пределами контейнера, но вам вообще не обязательно иметь ее в вашей связанной папке на хост-компьютере.

Например, вы можете создать свой интерфейсный проект NodeJS в контейнере, где для него необходима папка node_modules, но вам вообще не нужна эта папка для вашего кодирования. Затем вы можете сопоставить папку вашего проекта с какой-либо папкой вне контейнера и установить папку node_modules в качестве анонимного тома. Папка Node_modules будет присутствовать в контейнере все время, даже если ее нет на хост-компьютере в вашей рабочей папке.

person Vlastimil Cervenka    schedule 16.03.2021