Há muito o que explicar aqui, mas vou vincular uma das minhas respostas anteriores para um problema semelhante - as etapas são realmente as mesmas porque apenas o serviço de banco de dados e o plano de fundo diferem.
1) A primeira coisa é que você precisa fornecer um script bash que aguardará até que um serviço responda via http. Em bancos de dados, geralmente acontece quando o banco de dados está pronto e todas as inicializações são feitas.
o script wait-for-it.sh escrito por vishnubob em sua espere por isso repo @ github.
2) Segunda coisa, você precisa obter esse script dentro de cada contêiner que requer seu banco de dados.
3) Terceiro, você especifica um
entrypoint
em seu arquivo de composição, que executará o script em espera antes do command
real executar seu serviço será acionado. exemplo de um ponto de entrada (como referência à resposta que vinculo)
docker-entrypoint.sh:
#!/bin/bash
set -e
sh -c './wait-for-it.sh oracle:3306 -t 30'
exec "[email protected]"
Todas essas etapas são explicadas em detalhes aqui no cenário 2, esteja ciente de uma referência à minha outra resposta dentro da resposta que estou apontando aqui. Esse problema é muito comum para iniciantes e exige bastante explicação, então não posso postar tudo aqui.
observação aqui sobre
depends_on
que você pode pensar que é uma solução nativa para esse problema do docker - como os documentos afirmam, ele apenas espera até que o contêiner esteja em execução, não terminando seus trabalhos internos - o docker não está ciente de quanto deve ser feito.