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"]
排查与解决步骤
修复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
- 更新
完善JDBC URL参数
MySQL 8.x默认开启SSL,可能引发连接异常,需添加参数关闭SSL并指定时区:SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true(
allowPublicKeyRetrieval=true用于解决部分场景下公钥获取失败问题)确认Hibernate扫描配置
确保实体类标注了@Entity注解,且Spring Boot能扫描到实体类所在包。可在启动类添加@EntityScan(basePackages = "com.example.entity")(替换为你的实体类实际包路径)。查看Spring Boot容器日志
执行docker logs <backend-container-id>查看启动日志,排查是否存在数据库连接失败、Hibernate初始化异常等信息,比如密码错误、数据库未就绪等问题。清理MySQL数据卷
若之前启动过MySQL容器,数据卷mysql-data可能留存旧数据导致表未重建,可删除数据卷后重新部署:docker-compose down -v docker-compose up --build
内容的提问来源于stack exchange,提问作者juanl4zy
相关产品推荐
相关产品推荐

