🐳 Эффективное управление окружениями с Docker Compose



В рамках разработки приложений часто возникает необходимость в создании нескольких окружений. Например, окружение для продакшена и девелопмента. Эти окружения могут отличаться по конфигурациям, инструментам и сервисам, необходимым для работы.



Предположим, что мы хотим разработать окружения для Spring Boot приложения, использующего PostgreSQL и Kafka:

* Для продакшена: минимальный набор сервисов – Spring Boot, PostgreSQL и Kafka.

* Для разработки: расширенный набор, Spring Boot, PostgreSQL, Kafka и удобные инструменты для работы, такие как pgAdmin и KafkaUI.



Мы рассмотрим решение этой задачи в контексте использования Docker Compose. Отметим, что в большинстве случаев для продакшена рекомендуется использовать более продвинутые решения, например, Kubernetes.



Возможные способы решения поставленной задачи



1. Один файл с профилями

Можно описать все сервисы в одном docker-compose.yml и использовать профили для разделения сервисов, необходимых в продакшене и разработке. Такой подход позволит легко управлять сервисами, активируя нужные профили в зависимости от окружения.



Преимущества:

* Один файл для управления всеми сервисами.

* Легкость переключения между окружениями за счёт использования профилей.



Недостатки:

* Отсутствие гибкости: сложно настроить разные порты, скрипты инициализации для сервисов в разных окружениях.

* Не всегда удобен для сложных конфигураций.



2. Дублирование файлов



Преимущества:

* Полная гибкость в настройке каждого окружения.

* Можно легко добавить уникальные параметры и сервисы для каждого случая.



Недостатки:

* Дублирование кода.

* Сложность синхронизации изменений между файлами.

* Проблемы с поддержкой нескольких файлов (например, при добавлении нового сервиса).



3. Переиспользование сервисов с include и extends



Возможно, не все знают, но Docker Compose предоставляет ключевые слова include и extends, которые могут отлично подойти для нашей задачи. Эти конструкции позволяют избежать дублирования кода, переиспользуя общие сервисы между различными файлами.



* Include даёт возможность подключить один docker compose файл к другому, аналогично запуску нескольких файлов через терминал. Этот способ полезен, если нам нужно просто включить сервисы без дополнительных изменений.

* Extends – более гибкий инструмент, который позволяет подключить сервисы из одного файла в другой и переопределить их свойства, что особенно удобно, если требуется настроить окружение под разные нужды.



Преимущества:

* Избегаем дублирования кода.

* Гибкость при настройке сервисов в разных окружениях.

* Возможность вынести общие сервисы в отдельный файл и изменять их конфигурации в каждом окружении.



Недостатки:

* Сложнее в реализации и поддержке по сравнению с одним файлом с профилями.

* Потребуются дополнительные знания о синтаксисе docker-compose.



services.yml (общие сервисы)





version: '3.8'

services:

postgres:

image: postgres:13

kafka:

image: bitnami/kafka:latest





docker-compose.prod.yml:





version: '3.8'

services:

spring:

image: my-spring-app:latest

postgres:

extends:

file: services.yml

service: postgres

kafka:

extends:

file: services.yml

service: kafka





docker-compose.dev.yml:





version: '3.8'

services:

postgres:

extends:

file: services.yml

service: postgres

kafka:

extends:

file: services.yml

service: kafka

pgadmin:

image: dpage/pgadmin4

kafka-ui:

image: provectuslabs/kafka-ui





Таким образом, extends позволяет нам гибко конфигурировать окружения и при этом не дублировать код, что делает этот способ наиболее подходящим для нашей задачи.



Ставь ❤️ если знал про extends/include и 🔥 если не знал



#DockerCompose #Tips