Текст и данные · Инструкция
Docker Compose x-extensions: как убрать дубли
Extension fields с префиксом `x-` позволяют вынести повторяющиеся фрагменты Compose-конфигурации, а YAML anchors — переиспользовать их в сервисах. Это уменьшает дублирование, но добавляет слой косвенности.
Короткий ответ
В Compose пользовательские extension fields начинаются с `x-`: Compose игнорирует их как служебные блоки, а YAML anchors/aliases позволяют переиспользовать общую конфигурацию.
Что важно знать про Docker Compose extensions
Extensions полезны, когда несколько services повторяют logging, labels, environment или другие mappings. Вместо копирования можно вынести общий блок и подключать его anchors. Docker Docs подчёркивает, что `x-` — специальное исключение: такие fields разрешены как пользовательские расширения и не трактуются как неизвестные свойства Compose.
Совет: Называйте x-блок по смыслу (`x-logging`, `x-common-env`), а не `x-default`.
Как вынести повторяющийся Compose-блок
- Выделите повторяющийся mapping.
- Создайте `x-common` с YAML anchor.
- Подключите anchor в нужные services.
- Добавьте локальные overrides.
- Проверьте итог через `docker compose config`.
Предупреждение: Не доверяйте глазами YAML merge — проверяйте результат через `docker compose config`.
Нюансы: merge и compose.yaml
YAML merge может скрыть итоговую структуру от глаза, особенно при нескольких уровнях anchors. Поэтому после изменений полезно запускать `docker compose config` и смотреть нормализованный результат. Не выносите всё подряд. Повторяющийся технический блок подходит хорошо; критичные отличия сервисов лучше оставлять рядом с самим service, чтобы конфигурацию было проще расследовать.
Важно: Оставляйте security-critical отличия рядом с сервисом, даже если их можно абстрагировать.
Пример: общий logging через anchor
`x-logging: &logging` хранит одинаковый driver/options, а services используют `logging: *logging` без копирования блока.
Как вынести общий блок
Создайте top-level `x-common` или более конкретный extension block, задайте ему YAML anchor и подключите mapping к нужным services. Локальные различия оставьте рядом с сервисом. После каждого изменения запускайте `docker compose config`, чтобы увидеть, что реально получилось после YAML merge и Compose-нормализации.
Что не стоит прятать в extension
Если параметр критичен для понимания конкретного сервиса — port, security option или уникальный volume — чрезмерная абстракция усложняет аудит. Extensions лучше работают для действительно повторяющихся технических блоков вроде logging, labels или общей части environment. Цель — убрать дубли, а не спрятать архитектуру.
Проверка x-extensions
- Повторяющийся блок вынесен в `x-` extension с понятным именем.
- YAML anchor/merge не скрывает критичные различия между сервисами.
- `docker compose config` показывает ожидаемый результат после merge.
- Уникальные ports, volumes и security-параметры оставлены рядом с соответствующим service, если так конфигурация понятнее.
Что учитывать
Extensions полезны, когда несколько services повторяют logging, labels, environment или другие mappings. Вместо копирования можно вынести общий блок и подключать его anchors. Docker Docs подчёркивает, что `x-` — специальное исключение: такие fields разрешены как пользовательские расширения и не трактуются как неизвестные свойства Compose.
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. Extensions in Compose). Пример и формулировки — редакция N1RO на 2026-09-22.