Программирование
Повторное использование кода в 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 ...
Я не мог понять этот синтаксис, и мне стало любопытно. Погуглив, я обнаружил, что это функция 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