skip to Main Content

I have built a CRUD application using spring-boot and MySQL, MySQL is in docker and I am able to connect from local and my application is working. But when I tried to deploy the Spring-boot application in docker now it is not able to connect to Docker MySQL.

## Spring application.properties

server.port=8001

# MySQL Props
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto = create
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:9001}/${MYSQL_DATABASE:test-db}
spring.datasource.username=${MYSQL_USER:admin}
spring.datasource.password=${MYSQL_PASSWORD:nimda}
##Dockerfile

FROM openjdk:11

RUN apt-get update

ADD target/mysql-crud-*.jar mysql-crud.jar

ENTRYPOINT ["java", "-jar", "mysql-crud.jar"]
## docker-compose.yml

version: '3.9'

services:
  dockersql:
    image: mysql:latest
    restart: always
    container_name: dockersql
    ports:
      - "3306:3306"
    env_file: .env
    environment:
      - MYSQL_DATABASE=$MYSQL_DATABASE
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
    networks:
      - crud-network

  mycrud:
    depends_on:
      - dockersql
    restart: always
    container_name: mycrud
    env_file: .env
    environment:
      - MYSQL_HOST=dockersql:3306
      - MYSQL_DATABASE=$MYSQL_DATABASE
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
    build: .
    networks:
      - crud-network

networks:
  crud-network:
    driver: bridge
# .env file

MYSQL_DATABASE=test-db
MYSQL_USER=admin
MYSQL_PASSWORD=nimda
MYSQL_ROOT_PASSWORD=nimda

Can anyone help me?

2

Answers


  1. Chosen as BEST ANSWER

    I found out that before MySQL is completely up and running, my spring boot tries to connect MySQL and that is causing the error.

    After adding

    mycrud:
        depends_on:
          - dockersql
        container_name: mycrud
        restart: on-failure
    

    It resolves my issue.


  2. Even better add a health check for MySQL and make it a condition for spring boot to start

    dockersql:
      healthcheck:
        test: [ "CMD-SHELL", 'mysql --user=${MYSQL_USER} --database=${MYSQL_DATABASE} --password=${MYSQL_PASSWORD} --execute="SELECT count(table_name) > 0 FROM information_schema.tables;"' ]
    
    mycrud:
      depends_on:
        dockersql:
          condition: service_healthy
    

    The –execute can also be modified to include application-specific healthcheck. for example, checking on a specific table that it exists.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search