Adamantine Blog post
#Docker#programování#JavaScript#DevOps#Docker Compose

Nástroj Octo Compose

Daniel Švub
12/9/2022

Nástroj Octo Compose

SpongeData Octo Compose je nástroj rozšiřující možnosti Docker Compose. Byl vyvinut v jazyce JavaScript a je volně dostupný na oficiálním GitHub profilu společnosti SpongeData. Použití nástroje Docker Compose výrazně zjednodušuje konfiguraci projektů s mnoha službami, pokud však uživatel potřebuje aplikaci nasazovat v několika různých prostředích či několika podobách, nezbaví se značné redundance v konfiguračních YAML souborech.

Octo Compose umožňuje zkombinovat kořenové konfigurační soubory (cluster-compose.yml) a konfigurační soubory jednotlivých služeb (octo-compose.yml) do jedné výsledné konfigurace. Kořenových souborů lze použít více a konfiguraci tak ve vrstvách doplňovat nebo i přepisovat. Dále je možné ve všech těchto souborech používat enviromentální proměnné. Ty je nutné před použitím Octo Compose předem vytvořit (například načtením ze shellových skriptů příkazem source).

Mějme například projekt obsahující čtyři služby: backend server, frontend server, relační databázi a vyhledávací engine. Každá zmíněná služba musí běžet v separátním kontejneru, dále předpokládejme, že je nutné všechny z nich střídavě spouštět ve třech různých prostředích: lokálně na počítači vývojáře, v cloudovém testovacím prostředí a na produkčním clusteru. Projekt navíc může být nasazen ve dvou odlišných režimech, jež vyžadují rozdílné hodnoty enviromentálních proměnných a lokace pro ukládání dat.

K vytváření a orchestraci kontejnerů přirozeně využijeme nástroj Docker Compose, který nám dává možnost projekt nasadit velice rychle. Z důvodu tří prostředí a dvou specializovaných režimů ovšem potřebujeme udržovat šest různých souborů docker-compose.yml, přestože většina konfigurace v nich bude naprosto shodná. Při změně některého z ve všech souborech totožných klíčů tedy bude třeba tento přepsat na šesti různých místech.

A právě zde nastupuje Octo Compose. Díky jeho podpoře šablonování lze v konfiguračních souborech používat enviromentální proměnné, které definujeme v samostatných souborech. Klíče, které jsou pro všechny konfigurace společné, zapíšeme pouze do hlavního souboru (kupříkladu project.env) a pouze specifika definujeme separátně (například jako project.dev.m1.env). Před samotným generováním cílového YAML souboru všechny relevantní proměnné expandujeme.

Analogický postup lze použít i v případě YAML souborů, Octo Compose totiž umožňuje nadefinovat více zdrojů. Není tak již třeba otrocky kopírovat konfigurace. Octo Compose všechny soubory spojí dohromady, vloží do nich na patřičná místa obsah enviromentálních proměnných a vygeneruje cílový soubor docker-compose.yml, který potom už pouze zužitkujeme nástrojem Docker Compose. Příklad kořenového souboru cluster-compose pro zmíněný případ užití:

version: '3.8'

services:

  frontend:
    octo-compose:
      context: ./frontend/
    octo-deploy:
      placement:
        - fe_server
      registry: ${REGISTRY_IP}:${REGISTRY_PORT}
      replicas: 1

  backend:
    octo-compose:
      context: ./backend/
    octo-deploy:
      placement:
        - be_server
      registry: ${REGISTRY_IP}:${REGISTRY_PORT}
      replicas: 2

  postgre:
    octo-compose:
      context: ./postgre/
    octo-deploy:
      placement:
        - db_server
      registry: ${REGISTRY_IP}:${REGISTRY_PORT}
      replicas: 1

  solr:
    octo-compose:
      context: ./solr/
    octo-deploy:
      placement:
        - db_server
      registry: ${REGISTRY_IP}:${REGISTRY_PORT}
      replicas: 1

Tuto základní konfiguraci doplníme o konfiguraci specifickou pro dané prostředí a daný mód (soubory cluster-compose.dev.yml a cluster-compose.m1.yml). Z adresáře definovaného klíčem context je pro každou službu automaticky načten soubor octo-compose.yml, v němž se nachází přesnější konfigurace služby. Ten může vypadat například takto:

frontend:

  image: ${REGISTRY}/fe

  build:
    context: .
    dockerfile: ./dpes/Dockerfile.${DOCKERFILE_SUFFIX}
  ports:
    - 3333:3333
  restart: unless-stopped

  volumes:
    - ${STORAGE_PATH}/logs:/logs
    - ${STORAGE_PATH}/data:/data

Cílový docker-compose.yml následně vygenerujeme příkazem octo-compose -i cluster-compose.yml -i cluster-compose.dev.yml -i cluster-compose.m1.yml -o docker-compose.yml. Ještě před tím načteme enviromentální proměnné zadáním source project.env a source project.dev.m1.env. Pokud popsaný postup navíc zautomatizujeme za použití skriptu nebo Makefile, deployment jakéhokoli složitějšího projektu se násobně usnadňuje. Stačí jen nainstalovat Octo Compose pomocí npm install octo-compose a život je jednodušší.

Antivirová kontrola nové generace

Produkt Adamantine zvyšuje ochranu před únikem citlivých údajů Vašich zákazníků.

Kontaktujte nás