Docker compose винаги стартира и спира контейнерите в ред на зависимости или последователен във файла, ако не е зададен. Но docker-compose не гарантира, че ще изчака, докато контейнерът на зависимостта се изпълни. Можете да препоръчате
тук за повече подробности. Така че проблемът тук е, че вашата база данни не е готова, когато вашият spring-mysql
контейнерът се опитва да получи достъп до базата данни. И така, препоръчителното решение е, че можете да използвате чакай.ш
или подобен скрипт за обвиване на вашия spring-mysql
приложение, стартиращо ENTRYPOINT
.
Като пример, ако използвате wait-for-it.sh
вашата ENTRYPOINT
във вашия Dockerfile трябва да се промени на следното след копиране на горния скрипт в корена на вашия проект:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
И две други важни неща, които трябва да имате предвид тук, са:
- Не използвайте връзки, те са оттеглени вместо това трябва да използвате дефинирана от потребителя мрежа. Всички услуги във файла docker-compose ще бъдат в една дефинирана от потребителя мрежа, ако не дефинирате изрично никаква мрежа. Така че просто трябва да премахнете връзките от файла за създаване.
- Не е необходимо да публикувате порта за докер контейнера, ако го използвате само в дефинираната от потребителя мрежа.