A composição do Docker sempre inicia e interrompe os contêineres em ordem de dependência ou ordem sequencial no arquivo, se não for fornecida. Mas o docker-compose não garante que ele aguardará até que o contêiner de dependência esteja em execução. Você pode referir aqui para mais detalhes. Então o problema aqui é que seu banco de dados não está pronto quando seu
spring-mysql
container tenta acessar o banco de dados. Portanto, a solução recomendada é usar espere por isso.sh
ou script semelhante para envolver seu spring-mysql
aplicativo iniciando ENTRYPOINT
. Por exemplo, se você usar
wait-for-it.sh
seu ENTRYPOINT
no seu Dockerfile deve mudar para o seguinte após copiar o script acima para a raiz do seu projeto:ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
E duas outras coisas importantes a considerar aqui são:
- Não use links, eles estão obsoleto você deve usar a rede definida pelo usuário. Todos os serviços no arquivo docker-compose estarão em uma única rede definida pelo usuário se você não definir explicitamente nenhuma rede. Então você só precisa remover os links do arquivo de composição.
- Você não precisa publicar a porta para o contêiner docker se apenas usá-la dentro da rede definida pelo usuário.