Docker compose startet und stoppt Container immer in Abhängigkeitsreihenfolge oder in sequenzieller Reihenfolge in der Datei, falls nicht angegeben. Docker-Compose garantiert jedoch nicht, dass es wartet, bis der Abhängigkeitscontainer ausgeführt wird. Sie können verweisen
hier für weitere Details. Das Problem hier ist also, dass Ihre Datenbank nicht bereit ist, wenn Ihr spring-mysql
Container versucht, auf die Datenbank zuzugreifen. Die empfohlene Lösung ist also, dass Sie verwenden könnten wait-for-it.sh
oder ein ähnliches Skript zum Umschließen Ihres spring-mysql
App, die ENTRYPOINT
startet .
Als Beispiel, wenn Sie wait-for-it.sh
verwenden Ihr ENTRYPOINT
in Ihrer Docker-Datei sollte sich nach dem Kopieren des obigen Skripts in Ihren Projektstamm wie folgt ändern:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
Und zwei weitere wichtige Dinge, die hier berücksichtigt werden sollten, sind:
- Verwenden Sie keine Links, sie sind veraltet Sie sollten stattdessen ein benutzerdefiniertes Netzwerk verwenden. Alle Dienste in der Docker-Compose-Datei befinden sich in einem einzelnen benutzerdefinierten Netzwerk, wenn Sie kein Netzwerk explizit definieren. Sie müssen also nur die Links aus der Compose-Datei entfernen.
- Sie müssen den Port für den Docker-Container nicht veröffentlichen, wenn Sie ihn nur innerhalb des benutzerdefinierten Netzwerks verwenden.