Docker compose siempre inicia y detiene los contenedores en orden de dependencia o en orden secuencial en el archivo si no se proporciona. Pero docker-compose no garantiza que esperará hasta que se ejecute el contenedor de dependencias. Puede referir
aquí para más detalles. Entonces, el problema aquí es que su base de datos no está lista cuando su spring-mysql
contenedor intenta acceder a la base de datos. Entonces, la solución recomendada es que podría usar espéralo.sh
o script similar para envolver su spring-mysql
aplicación que inicia ENTRYPOINT
.
Como ejemplo, si usa wait-for-it.sh
tu ENTRYPOINT
en su Dockerfile debería cambiar a lo siguiente después de copiar el script anterior a la raíz de su proyecto:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
Y otras dos cosas importantes a considerar aquí son:
- No use enlaces, están obsoletos en su lugar, debe usar una red definida por el usuario. Todos los servicios en el archivo docker-compose estarán en una sola red definida por el usuario si no define explícitamente ninguna red. Entonces solo tiene que eliminar los enlaces del archivo de composición.
- No necesita publicar el puerto para el contenedor docker si solo lo usa dentro de la red definida por el usuario.