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 částihealthcheck
.CMD-SHELL
umožňuje spustit příkazy v kontejnerucurl -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/