Docker compose start en stopt containers altijd in afhankelijkheidsvolgorde, of sequentiële volgorde in het bestand als deze niet is opgegeven. Maar docker-compose garandeert niet dat het zal wachten tot de afhankelijkheidscontainer wordt uitgevoerd. U kunt verwijzen
hier voor meer details. Het probleem hier is dus dat uw database niet gereed is wanneer uw spring-mysql
container probeert toegang te krijgen tot de database. De aanbevolen oplossing is dus dat u kunt gebruiken wait-for-it.sh
of soortgelijk script om uw spring-mysql
. in te pakken app start ENTRYPOINT
.
Als voorbeeld als u wait-for-it.sh
. gebruikt uw ENTRYPOINT
in je Dockerfile zou moeten veranderen in het volgende na het kopiëren van het bovenstaande script naar de hoofdmap van je project:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
En twee andere belangrijke dingen om te overwegen zijn:
- Gebruik geen links, deze zijn verouderd in plaats daarvan moet u een door de gebruiker gedefinieerd netwerk gebruiken. Alle services in het docker-compose-bestand bevinden zich in een door de gebruiker gedefinieerd netwerk als u niet expliciet een netwerk definieert. Je hoeft dus alleen maar de links uit het samengestelde bestand te verwijderen.
- U hoeft de poort voor de docker-container niet te publiceren als u deze alleen binnen het door de gebruiker gedefinieerde netwerk gebruikt.