最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

hibernate - Spring Boot App Fails to Connect to MySQL in Docker-Compose - Stack Overflow

programmeradmin0浏览0评论

I have a Spring Boot application that works fine on my local machine with MySQL. Now, I’m trying to containerize it using Docker Compose, but the application fails to connect to the database when I run docker-compose up.

My Setup

I have the following docker-compose.yml:

version: '3.9'

services:
  book_service_db:
    image: mysql:8.0
    command: --default-authentication-plugin=caching_sha2_password
    environment:
      MYSQL_ROOT_PASSWORD: r0dRig$o!
      MYSQL_DATABASE: book_service
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
    ports:
      - "3306:3306"
    networks:
      app_network:
        ipv4_address: 172.20.0.2
    container_name: book_service_db
    restart: always
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 10
      start_period: 60s  # Ensures MySQL is fully started before dependent services try to connect

  book-service:
    build:
      context: ./../book-service
      dockerfile: Dockerfile
    ports:
      - "8081:8080"
    networks:
      app_network:
        ipv4_address: 172.20.0.5
    depends_on:
      book_service_db:
        condition: service_healthy  # Ensures book-service starts only when MySQL is ready
    container_name: book_service
    restart: always

networks:
  app_network:
    ipam:
      config:
        - subnet: 172.20.0.0/24
    driver: bridge

My Dockerfile for book-service:

FROM openjdk:17-jdk-slim

WORKDIR /app

COPY /target/*.jar /app/app.jar

EXPOSE 8080

RUN apt-get update && apt-get install -y iputils-ping net-tools dnsutils default-mysql-client

ENTRYPOINT ["java", "-jar", "app.jar"]

And my application.properties contains:

# Application details
spring.application.name=Book-Service
server.port=8082

# MySQL Configuration
spring.datasource.url=jdbc:mysql://book_service_db:3306/book_service?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=.hibernate.dialect.MySQL8Dialect
spring.datasource.username=admin
spring.datasource.password=admin

# Hibernate Configuration
spring.jpa.hibernate.ddl-auto=update
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always
spring.sql.init.data-locations=classpath:data.sql

The Issue

When I run docker-compose up, the application fails to connect to the database, and I get the following error:

2025-03-16 15:07:07 Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
.
.
.
2025-03-16 15:07:07 Caused by: .hibernate.service.spi.ServiceException: Unable to create requested service [.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
.
.
.
2025-03-16 15:07:07 Caused by: .hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)

What I Have Tried

  1. I can successfully ping the database from the application container using:

    ping book_service_db
    
  2. I can connect manually from inside the container using:

    mysql -h book_service_db -u admin -p
    

    This confirms that the database credentials are correct.

  3. I have tried modifying the MySQL command with different authentication plugins, but none of them worked:

    command: --default-authentication-plugin=mysql_native_password --bind-address=0.0.0.0
    command: --default-authentication-plugin=mysql_native_password
    command: --default-authentication-plugin=caching_sha2_password
    

Question

Why is my Spring Boot app failing to connect to MySQL inside Docker? The database is reachable from the container, but Hibernate throws a dialect error. Is there something wrong with my database configuration or health check timing?

Any help would be greatly appreciated!

发布评论

评论列表(0)

  1. 暂无评论