Программирование

Повторное использование кода в Docker-Compose с использованием функции привязки YAML

Как программист, мы в основном сосредоточены на максимально возможном повторном использовании кода. Но слышали ли вы когда-нибудь о повторном использовании кода при написании docker-compose файлов? Нет? Я тоже, пока не нашел этот файл docker-compose [1].

...
services:
    spilo1: &spilo
        image: spilo        
        ...
        hostname: spilo1
        container_name: demo-spilo1
    spilo2:
        <<: *spilo
        hostname: spilo2
        container_name: demo-spilo2
...


Управление резервными копиями Postgres с помощью Spilo
Хранение резервных копий в AWS S3awstip.com



Я не мог понять этот синтаксис, и мне стало любопытно. Погуглив, я обнаружил, что это функция YAML под названием anchor.

Согласно этим ссылкам [2][3]:

YAML также имеет удобную функцию под названием «якоря», которая позволяет легко дублировать содержимое в документе.

Давайте посмотрим на пример ниже из тех же ссылок [2][3].

base: &base_anchor
    name: Everyone has same name

foo:
    # inheriting base
    <<: *base_anchor
    age: 10

Чтобы унаследовать содержимое base, нам нужен &base_anchor. Используя этот якорь, мы можем продублировать его содержимое в foo, используя <<: *base_anchor.

Впечатляет, правда? Но вопрос в том, где мы могли бы использовать эту функцию? Ответ — Сформировать кластер локально с помощью файла docker-compose.

Давайте воспользуемся этой функцией, создав кластер MongoDB с помощью docker-compose.

Пример — локальный кластер MongoDB с использованием docker-compose

⚠️ Обратите внимание, я следовал этому руководству [4] для локального создания кластера MongoDB. Я не буду вдаваться в подробности, поскольку это выходит за рамки данной статьи.

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

version: '3.3'
services:
  mongo-test-1:
    container_name: mongo-test-1
    image: mongo:4.4.15
    tmpfs: /data/db
    ports:
    - "27017:27017"
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
  mongo-test-2:
    container_name: mongo-test-2
    image: mongo:4.4.15
    tmpfs: /data/db
    ports:
    - "27018:27017"
    volumes:
    - ./initdb-script:/initdb-script:Z
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
  mongo-test-3:
    container_name: mongo-test-3
    image: mongo:4.4.15
    tmpfs: /data/db
    ports:
    - "27019:27017"
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]

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

version: '3.3'
services:
  mongo-test-1: &mongo
    container_name: mongo-test-1
    image: mongo:4.4.15
    tmpfs: /data/db
    ports:
    - "27017:27017"
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
  mongo-test-2:
    <<: *mongo
    container_name: mongo-test-2
    ports:
    - "27018:27017"
    volumes:
    - ./initdb-script:/initdb-script:Z
  mongo-test-3:
    <<: *mongo
    container_name: mongo-test-3
    ports:
    - "27019:27017"

Представление фиксации GitHub, чтобы сделать изменения более заметными.

Исходный код



Я бы порекомендовал пройти через этот репозиторий через коммиты. Это даст больше ясности в концепции благодаря подсветке синтаксиса. Это дает нам такое же ощущение, как будто мы просматриваем какие-то пулл-реквесты.

Ресурсы

[1] https://github.com/zalando/spilo/blob/master/postgres-appliance/tests/docker-compose.yml

[2] https://stackoverflow.com/a/45805673

[3] https://learnxinyminutes.com/docs/yaml/

[4] https://blog.tericcabrel.com/mongodb-replica-set-docker-compose/

Спасибо за прочтение. Если вам понравился этот пост, возможно, вам понравятся и другие мои истории из серии программирование.

Want to connect?
http://anasanjaria.bio.link/
Want to subscribe to my newsletter?
https://medium.com/subscribe/@anasanjaria