Docker compose startar och stoppar alltid behållare i beroendeordning, eller sekventiell ordning i filen om den inte anges. Men docker-compose garanterar inte att det kommer att vänta tills beroendebehållaren körs. Du kan refera
här för mer information. Så problemet här är att din databas inte är redo när din spring-mysql
container försöker komma åt databasen. Så den rekommenderade lösningen är att du kan använda wait-for-it.sh
eller liknande skript för att omsluta din spring-mysql
app som startar ENTRYPOINT
.
Som exempel om du använder wait-for-it.sh
din ENTRYPOINT
i din Dockerfil bör ändras till följande efter att ha kopierat ovanstående skript till din projektrot:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
Och två andra viktiga saker att tänka på här är:
- Använd inte länkar de är utfasade du bör använda användardefinierat nätverk istället. Alla tjänster i docker-compose-filen kommer att vara i ett enda användardefinierat nätverk om du inte uttryckligen definierar något nätverk. Så du behöver bara ta bort länkarna från skrivfilen.
- Du behöver inte publicera porten för dockercontainer om du bara använder den inom det användardefinierade nätverket.