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_healthyznamená, že v tomto případě elasticsearch je healthy (zdravý) a podmínky tohoto „zdraví“ jsou definovány v částihealthcheck.CMD-SHELLumožňuje spustit příkazy v kontejnerucurl -s http://localhost:9200získá odpověď z dané url. Pokud servisa neodpovídá, dostává:Failed to connect to localhost port 9200 after 0 ms: Connection refusedgrep -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/