Healthcheck a depends_on v docker-compose

depends_on pouze zajistí, že kontejner, na který je depends_on, nastartuje jako první. Nezajišťuje ale, že daná servisa je připravená. K tomu je potřeba nastavit healthcheck. Jako příklad ukážu elasticsearch a logstash, kdy logstah čeká na elasticsearch.

elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
    container_name: elasticsearch
    healthcheck:
      test: [ "CMD-SHELL", "curl -s http://localhost:9200 | grep -q 'You Know, for Search'" ]
      interval: 10s
      retries: 5
      start_period: 20s
      timeout: 5s

logstash:
    image: docker.elastic.co/logstash/logstash:8.10.2
    container_name: logstash
    depends_on:
      elasticsearch:
        condition: service_healthy
  • service_healthy znamená, že v tomto případě elasticsearch je healthy (zdravý) a podmínky tohoto „zdraví“ jsou definovány v části healthcheck.
  • CMD-SHELL umožňuje spustit příkazy v kontejneru
  • curl -s http://localhost:9200 získá odpověď z dané url. Pokud servisa neodpovídá, dostává: Failed to connect to localhost port 9200 after 0 ms: Connection refused
  • grep -q 'You Know, for Search' v odpovědi získané curlem se snaží získat řetězec 'You Know, for Search', který se vrací v případě, že elasticsearch odpovídá. Pokud tento řetězec nezíská, tak po několika pokusech (retries) docker-compose skončí hláškou: dependency failed to start: container elasticsearch is unhealthy

Zdroj: https://docs.docker.com/compose/how-tos/startup-order/