You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose执行正常但MySQL容器无表,Spring Boot连接异常排查

问题:Docker Compose部署Spring Boot+MySQL时无法自动创建数据库表

Docker Compose执行无报错无警告,但MySQL容器内未生成预期的数据库表。本地运行MySQL实例时表能正常创建,切换为容器部署则失败。


相关配置文件

docker-compose.yml

services:
  backend:
    build:
      context: ./backend/
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/${MYSQL_DATABASE}
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}
    networks:
      - springboot-mysql-network
  db:
    image: mysql:8.0.36
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - springboot-mysql-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 3s
      timeout: 30s
      retries: 10

volumes:
  mysql-data:
networks:
  springboot-mysql-network:
    name: springboot-mysql-network

application.properties

spring.application.name=backend

# Datasource connection
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# Hibernate
spring.jpa.hibernate.ddl-auto=create
spring.jpa.generate-ddl=true

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.8'
    id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-devtools:3.2.0'
    implementation 'mysql:mysql-connector-java:8.0.28'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

backend/Dockerfile

FROM openjdk:17-alpine
RUN addgroup -S appuser && adduser -S appuser -G appuser
USER appuser:appuser
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

排查与解决步骤

  1. 修复JDBC驱动兼容性问题
    Spring Boot 3.x要求MySQL Connector/J版本≥8.0.32,当前使用的8.0.28版本过低。同时MySQL 8.x已废弃旧驱动类com.mysql.jdbc.Driver,需替换为com.mysql.cj.jdbc.Driver。

    • 更新build.gradle依赖:
      implementation 'mysql:mysql-connector-java:8.0.36'
      
    • 修改application.properties驱动类:
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      
  2. 完善JDBC URL参数
    MySQL 8.x默认开启SSL,可能引发连接异常,需添加参数关闭SSL并指定时区:

    SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    

    (allowPublicKeyRetrieval=true用于解决部分场景下公钥获取失败问题)

  3. 确认Hibernate扫描配置
    确保实体类标注了@Entity注解,且Spring Boot能扫描到实体类所在包。可在启动类添加@EntityScan(basePackages = "com.example.entity")(替换为你的实体类实际包路径)。

  4. 查看Spring Boot容器日志
    执行docker logs <backend-container-id>查看启动日志,排查是否存在数据库连接失败、Hibernate初始化异常等信息,比如密码错误、数据库未就绪等问题。

  5. 清理MySQL数据卷
    若之前启动过MySQL容器,数据卷mysql-data可能留存旧数据导致表未重建,可删除数据卷后重新部署:

    docker-compose down -v
    docker-compose up --build
    

内容的提问来源于stack exchange,提问作者juanl4zy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:24:53