Home > Back-end >  Multi Container Connection in docker
Multi Container Connection in docker

Time:03-26

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?

CodePudding user response:

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.

CodePudding user response:

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.

  • Related