Расширение сервисов и Compose файлов

Compose поддерживает два метода совместного использования общей конфигурации:

  1. Расширение файла Compose с помощью нескольких файлов Compose
  2. Расширением отдельных сервисов с помощью поля extends

Несколько Compose файлов

Использование нескольких Compose файлов позволяет настроить Compose приложение для различных сред и рабочих процессов.

Общие сведения о нескольких файлах Compose

По умолчанию, Compose читает два файла, docker-compose.yml и опционально docker-compose.override.yml файл. Условно, docker-compose.yml содержит базовую конфигурацию. Файл переопределения, как следует из его названия, может содержать измененную конфигурацию существующих сервисов или совершенно новых.

Если сервис определен в обоих файлах, то Compose объединяет конфигурации используя правила описанные в разделе добавление и замена конфигураций.

Для использования нескольких файлов переопределения или переопределяющий файл с другим именем, вы можете использовать опцию -f что бы указать список файлов. Compose объединяет файлы в том же порядке в котором они были указаны в командной строке. Дополнительную информацию об использовании опции -f читайте в руководстве по командам docker-compose.

Когда вы используете несколько конфигурационных файлов, вы должны удостовериться что все пути в файлах являются относительными по отношению к базовому Compose файлу (первый файл указанный после -f). Это требуется по тому что файлы переопределения могут быть не действительными Compose файлами. Файлы переопределения могут содержать небольшие фрагменты конфигурации. Отслеживание того какой фрагмент сервиса относится к какому пути является сложным и запутанным, по этому для облегчения восприятия путей все они должны быть определены относительно базового файла.

Пример варианта использования

В этом разделе представлены два общих сценария использования нескольких docker compose файлов: изменение Compose приложения для различных сред и выполнение административных задач в приложении Compose.

Различные среды

Обычным случаем для использования нескольких файлов является изменение Compose приложения для разработки на продакшн окружение или CI. Для поддержки подобных различий, вы можете разделить вашу Compose конфигурацию на несколько разных файлов:

Начнем с главного файла который определяет базовую конфигурацию сервисов.

docker-compose.yml

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

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

docker-compose.override.yml

web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379

Когда вы выполняете docker-compose up он автоматически читает файлы переопределения.

Теперь, было бы не плохо использовать данное Compose приложение с продакшн окружением. Итак, создадим другой файл переопределения (который может быть размещен в другом git репозитории и управляться другой командой разработчиков).

docker-compose.prod.yml

web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'

cache:
  environment:
    TTL: '500'

Для развертывания с использованием данного продакшн Compose файла вы можете выполнить следующую команду:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Данная команда разворачивает все три сервиса используя конфигурацию из файлов docker-compose.yml и docker-compose.prod.yml (но не из конфигурации для разработки docker-compose.override.yml).

Более подробную информацию вы можете найти в разделе использование Docker Compose в продакшн.

Административные задачи

Другим распространенным вариантом использования является выполнение нерегулярных или административных задач для одной или нескольких сервисов в Compose приложении. Пример ниже демонстрирует запуск бекапа базы данных.

Начнем с docker-compose.yml.

web:
  image: example/my_web_app:latest
  links:
    - db

db:
  image: postgres:latest

В docker-compose.admin.yml добавим новый сервис запускающую экспорт базы данных или бекап.

dbadmin:
  build: database_admin/
  links:
    - db

Для запуска обычного окружения выполните docker-compose up -d. Для зауска бекапа базы данных, так же нужно включить файл docker-compose.admin.yml.

docker-compose -f docker-compose.yml -f docker-compose.admin.yml \
    run dbadmin db-backup

Расширение сервисов

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

Примечание: links, volumes_from и depends_on никогда не передаются между сервисами с помощью extends. Эти исключения существуют что бы избежать неявных зависимостей — вы всегда задаете links и volumes_from локально. Это гарантирует, что зависимости между сервисами будут хорошо видны при чтении текущего файла. Определение этих свойств локально так же гарантирует что изменения в файле, на который сервисы ссылаются, не приведут к поломке.

Что такое расширенная конфигурация

Определяя любой сервис в файле docker-compose.yml, вы можете указать что вы расширяете другой сервис, как в этом примере:

web:
  extends:
    file: common-services.yml
    service: webapp

Данная конфигурация указывает Compose использовать конфигурацию от сервиса webapp определенного в файле common-services.yml. предположим что файл common-services.yml выглядит так:

webapp:
  build: .
  ports:
    - "8000:8000"
  volumes:
    - "/data"

В этом случае вы получите точно такой же результат, как если бы вы написали docker-compose.yml with the same build, ports и volumes configuration values defined directly under web.

Вы можете пойти дальше и определить (или переопределить) конфигурацию локально в docker-compose.yml:

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5

important_web:
  extends: web
  cpu_shares: 10

Вы также можете описать другие сервисы и привязать к ним ваш web сервис:

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5
  links:
    - db
db:
  image: postgres

Пример использования

Расширение отдельного сервиса полезно когда у вас есть несколько сервисов имеющих общую конфигурацию. Ниже приведен пример Compose приложения с двумя сервисами: web приложение и сервис очереди. Оба сервиса используют один и тот же код и множество опций конфигурации.

В файле common.yml мы задаем текущую конфигурацию:

app:
  build: .
  environment:
    CONFIG_FILE_PATH: /code/config
    API_KEY: xxxyyy
  cpu_shares: 5

В файле docker-compose.yml мы определяем конкретные сервисы использующие общую конфигурацию:

webapp:
  extends:
    file: common.yml
    service: app
  command: /code/run_web_app
  ports:
    - 8080:8080
  links:
    - queue
    - db

queue_worker:
  extends:
    file: common.yml
    service: app
  command: /code/run_worker
  links:
    - queue

Добавление и переопределение конфигурации

Compose копирует конфигурацию из исходного сервиса в локальный. Если опция конфигурации определена и в исходном сервисе и в локальном, локальное значение заменяет или дополняет значение из исходного.

Для параметров с одним значением, например image, command или mem_limit новое значение заменяет старое значение.

# original service
command: python app.py

# local service
command: python otherapp.py

# result
command: python otherapp.py

Примечание: В случае если заданы build и image, когда используется первая версия формата Compose файла, использование одной из опций в локальном сервисе отменяет вторую опцию, если она была задана в оригинальном сервисе.

К примеру, если в исходном сервисе задан image: webapp, а в локальном build: ., то в результате в сервисе будет задан build: ., но не image.

Это происходит по тому что build и image не могут быть использованы вместе в первой версии файла.

Для опций с множественными значениями, например ports, expose, external_links, dns, dns_search и tmpfs Compose объединяет оба набора значений:

# original service
expose:
  - "3000"

# local service
expose:
  - "4000"
  - "5000"

# result
expose:
  - "3000"
  - "4000"
  - "5000"

При использовании environment, labels, volumes и devices, Compose объединяет записи с локально определенными значениями имеющими приоритет:

# original service
environment:
  - FOO=original
  - BAR=original

# local service
environment:
  - BAR=local
  - BAZ=local

# result
environment:
  - FOO=original
  - BAR=local
  - BAZ=local

Документация по Docker Compose


Комментарии:

Комментариев нет, желаете стать первым?

Пожалуйста, авторизуйтесь что бы оставлять комментарии.