🐳🐳🚟 Улучшаем модульность Docker Compose с помощью include
Предлагаем рассмотреть функцию, доступную в Compose версии 2.20.0 и в версии
Docker Desktop 4.22, а именно атрибут
include, который делает файлы Compose модульными и пригодными для повторного использования.
Расширение файла Compose
Docker Compose позволяет повторно использовать существующий файл Compose, используя механизм extends. Этот атрибут позволяет обратиться к другому файлу Compose и выбрать службу, которую необходимо использовать в приложении, с возможностью переопределения атрибутов.
services:
database:
extends:
file: ../commons/compose.yaml
service: db
Это хорошее решение пока вам нужен только один сервис, и вы знаете о его внутренних деталях настройки. Но когда нужно повторно использовать конфиг, а вы не знаете о скрытых зависимостях, такой вариант не подходит.
Проблема merge Compose файлов
Еще одна опция — смержить набор Compose-файлов . Docker Compose принимает набор файлов, мержит и перезаписывает определение службы, чтобы создать модель приложения.
Для примера, от лица одной команды, определим файл Compose для сервиса. Создадим образ из Dockerfile и установим среду в env-файл:
services:
database:
builld: .
env-file:
- ./db.env
Теперь от лица другой команды создадим веб-приложение, для которого требуется доступ к базе данных:
services:
webapp:
depends_on:
- database
Все хорошо, пока не попытаться смержить:
docker compose -f compose.yaml -f ../database/compose.yaml.
Относительные пути, заданные вторым файлом Compose, будут разрешены не так, как было задумано, а из локального рабочего каталога, и приложение не будет работать должным образом.
Повторное использование
Флаг include был введен именно для этой цели. Он позволит включить весь файл Compose в модель приложения, точно так же, как вы бы выполнили copy/paste. Единственное отличие — он будет управлять ссылками на относительные пути, и файл Compose будет проанализирован так, как ожидается, запускаясь из исходного местоположения. Эта возможность значительно упрощает повторное использование кода другой команды без необходимости знать точные детали.
include:
../database/compose.yaml
services:
webapp:
depends_on:
- database
Здесь команда разработчиков инфраструктуры подготовила файл Compose для управления БД, возможно, включающий некоторые реплики, веб UI для проверки данных, тома для сохранения данных и прочее.
#гайд