Det finns mycket att förklara här, men jag ska länka ett av mina tidigare svar för ett liknande problem - stegen är faktiskt desamma eftersom endast databastjänsten och bakgrunden skiljer sig åt.
1) Det första är att du måste tillhandahålla ett bash-skript som väntar tills en tjänst svarar via http. I databaser händer det vanligtvis när DB är redo att gå och alla initialiseringar är gjorda.
wait-for-it.sh-skriptet skrivet av vishnubob i hans vänta-på-det repo @ github.
2) För det andra, du måste få det skriptet inuti varje behållare som kräver din DB.
3) För det tredje anger du en entrypoint
i din compose-fil, som kommer att köra det väntande skriptet före det faktiska command
att köra din tjänst kommer att utlösas.
exempel på en ingångspunkt (som referens till svaret jag länkar till)
docker-entrypoint.sh:
#!/bin/bash
set -e
sh -c './wait-for-it.sh oracle:3306 -t 30'
exec "[email protected]"
Alla dessa steg förklaras i detalj här i scenario 2, var medveten om en hänvisning till mitt andra svar i svaret jag pekar på här. Det här problemet är ett mycket vanligt problem för nybörjare och kräver ganska mycket förklaring, så jag kan inte lägga upp allt här.
notering här angående depends_on
vilket du kanske tror är en inbyggd lösning för det här problemet från docker - som docs säger, det väntar bara tills behållaren körs, inte faktiskt slutfört sina interna jobb - docker är inte medveten om hur mycket som ska göras.