Docker Compose zawsze uruchamia i zatrzymuje kontenery w kolejności zależności lub w kolejności sekwencyjnej w pliku, jeśli nie podano. Ale docker-compose nie gwarantuje, że będzie czekać na uruchomienie kontenera zależności. Możesz odnieść się
tutaj po dalsze szczegóły. Problem polega na tym, że Twoja baza danych nie jest gotowa, gdy Twój spring-mysql
kontener próbuje uzyskać dostęp do bazy danych. Zalecanym rozwiązaniem jest więc użycie czekaj-na-to.sh
lub podobny skrypt do zawijania spring-mysql
uruchamianie aplikacji ENTRYPOINT
.
Na przykład, jeśli używasz wait-for-it.sh
Twój ENTRYPOINT
w pliku Dockerfile powinien zmienić się na następujący po skopiowaniu powyższego skryptu do katalogu głównego projektu:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
I dwie inne ważne rzeczy do rozważenia to:
- Nie używaj linków, które są przestarzałe zamiast tego należy użyć sieci zdefiniowanej przez użytkownika. Wszystkie usługi w pliku docker-compose będą znajdować się w jednej sieci zdefiniowanej przez użytkownika, jeśli nie zdefiniujesz jawnie żadnej sieci. Musisz tylko usunąć linki z pliku do tworzenia.
- Nie musisz publikować portu dla kontenera dockera, jeśli używasz go tylko w sieci zdefiniowanej przez użytkownika.