Docker compose starter og stopper altid containere i afhængighedsrækkefølge eller sekventiel rækkefølge i filen, hvis ikke givet. Men docker-compose garanterer ikke, at den vil vente, indtil afhængighedsbeholderen kører. Du kan henvise
her for yderligere detaljer. Så problemet her er, at din database ikke er klar, når din spring-mysql
container forsøger at få adgang til databasen. Så den anbefalede løsning er, at du kan bruge wait-for-it.sh
eller lignende script til at indpakke din spring-mysql
app, der starter ENTRYPOINT
.
Som eksempel hvis du bruger wait-for-it.sh
dit ENTRYPOINT
i din Dockerfile skal ændres til følgende efter kopiering af ovenstående script til dit projektrod:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
Og to andre vigtige ting at overveje her er:
- Brug ikke links, de er forældede du bør bruge brugerdefineret netværk i stedet. Alle tjenester i docker-compose-filen vil være i et enkelt brugerdefineret netværk, hvis du ikke udtrykkeligt definerer noget netværk. Så du skal bare fjerne linkene fra skrivefilen.
- Du behøver ikke at udgive porten til docker-container, hvis du kun bruger den inden for det brugerdefinerede netværk.