Docker Compose avvia e interrompe sempre i contenitori in ordine di dipendenza o in ordine sequenziale nel file se non specificato. Ma docker-compose non garantisce che aspetterà fino a quando il contenitore delle dipendenze sarà in esecuzione. Puoi fare riferimento
qui per ulteriori dettagli. Quindi il problema qui è che il tuo database non è pronto quando il tuo spring-mysql
container tenta di accedere al database. Quindi, la soluzione consigliata è che potresti usare wait-for-it.sh
o uno script simile per avvolgere il tuo spring-mysql
app che inizia con ENTRYPOINT
.
Ad esempio se usi wait-for-it.sh
il tuo ENTRYPOINT
nel tuo Dockerfile dovrebbe cambiare in seguito dopo aver copiato lo script sopra nella radice del tuo progetto:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
E altre due cose importanti da considerare qui sono:
- Non utilizzare link, sono obsoleto dovresti invece usare la rete definita dall'utente. Tutti i servizi nel file di composizione Docker saranno in una singola rete definita dall'utente se non si definisce esplicitamente alcuna rete. Quindi devi solo rimuovere i collegamenti dal file di composizione.
- Non è necessario pubblicare la porta per il contenitore docker se la utilizzi solo all'interno della rete definita dall'utente.