Вам не хватает ключевого третьего варианта, именованных томов . Если вы объявите:
version: '3'
volumes:
build: {}
services:
cache:
image: ...
volumes:
- build:/build
Docker Compose создаст именованный том для вас;Вы можете увидеть это, например, docker volume ls
. Вы можете явно управлять временем жизни именованных томов и устанавливать для них несколько дополнительных параметров, которые иногда полезны. В документации Docker есть страница, описывающая именованные тома в некоторых деталях.
Я бы предположил, что именованные тома строго превосходят анонимные тома, поскольку они могут явно видеть, когда они создаются, иуничтожен, и для возможности установить дополнительные параметры для них. Вы также можете смонтировать одноименный том в несколько контейнеров. (В этой последовательности вопросов, которые вы задавали, я обычно рекомендовал бы вам использовать именованный том, смонтировать его в несколько контейнеров и заменить volumes_from:
.)
Именованные тома по сравнению с монтируемыми привязками имеют преимуществаи недостатки в обоих направлениях. Крепления для привязки легко создавать резервные копии и управлять ими, а для контента, такого как файлы журналов, который необходимо просмотреть напрямую, это намного проще;в системах MacOS они работают крайне медленно. Именованные тома могут работать независимо от любой структуры каталогов хост-системы и хорошо транслироваться в кластеризованные среды, такие как Kubernetes, но гораздо сложнее их изучить или создать резервную копию.
Практически никогда не требуется директива VOLUME
. Вы можете монтировать том или каталог хоста в контейнер независимо от того, объявлен ли он как том. Его технический эффект заключается в монтировании нового анонимного тома в этом месте, если там не установлено ничего другого;его практический эффект заключается в том, что он предотвращает изменение этого каталога в будущих шагах Dockerfile. Если у вас есть строка VOLUME
, вы почти всегда можете удалить ее, ничего не затрагивая.