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

Spring Boot配置Docker MySQL构建Jar包时启动失败求助

问题描述

我是Docker新手,正尝试将连接MySQL数据库的Spring Boot应用容器化,按照教程操作后,执行mvn clean install构建Jar包时出现启动失败错误。

错误详情

ApplicationContext启动失败,无法创建名为'entityManagerFactory'的Bean,嵌套异常显示无法打开JDBC连接以执行DDL操作。

相关配置

Application.properties

spring.datasource.url=jdbc:mysql://mysqldb:3306/employeedb?useSSL=false
spring.datasource.username=sa
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Dockerfile

FROM openjdk:8
ADD target/demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "demo-0.0.1-SNAPSHOT.jar"]

报错日志片段

Error starting ApplicationContext. To display the conditions 
report re-run your application with 'debug' enabled.
2023-05-22 16:33:55.304 ERROR 6245 --- [           main] 
o.s.boot.SpringApplication               : Application run 
failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.26.jar:5.3.26]

解决方案

核心问题是JDBC连接无法建立,分以下方向排查修复:

1. 本地构建的主机名冲突

执行mvn clean install时,应用会启动并尝试连接mysqldb,但本地环境不存在这个Docker专属的服务名,直接导致连接失败。解决办法:

  • 本地开发时,把application.properties里的数据源URL改为jdbc:mysql://localhost:3306/employeedb?useSSL=false,确保本地MySQL服务正常运行后再执行构建。
  • 或者构建时跳过测试阶段,避免应用启动:
    mvn clean install -DskipTests
    

2. Docker容器网络不通

Spring Boot容器和MySQL容器必须处于同一个Docker网络才能互相访问:

  • 用Docker Compose管理的话,默认会创建专属网络,只需在docker-compose.yml中定义两个服务:
    version: '3'
    services:
      mysqldb:
        image: mysql:8.0
        environment:
          MYSQL_DATABASE: employeedb
          MYSQL_USER: sa
          MYSQL_PASSWORD: 1234
          MYSQL_ROOT_PASSWORD: root
        ports:
          - "3306:3306"
      app:
        build: .
        ports:
          - "8080:8080"
        depends_on:
          - mysqldb
    
  • 手动启动容器的话,先创建网络再将两个容器加入:
    docker network create my-network
    docker run --name mysqldb --network my-network -e MYSQL_DATABASE=employeedb -e MYSQL_USER=sa -e MYSQL_PASSWORD=1234 -d mysql:8.0
    docker run --name my-app --network my-network -p 8080:8080 -d your-image-name
    

3. MySQL版本兼容性问题

如果使用MySQL 8.0+,默认密码认证方式为caching_sha2_password,可能和驱动不兼容:

  • 要么在JDBC URL中添加兼容参数:
    spring.datasource.url=jdbc:mysql://mysqldb:3306/employeedb?useSSL=false&allowPublicKeyRetrieval=true
    
  • 要么修改MySQL用户的认证方式为mysql_native_password:
    ALTER USER 'sa'@'%' IDENTIFIED WITH mysql_native_password BY '1234';
    FLUSH PRIVILEGES;
    

4. 数据库初始化缺失

确保employeedb数据库已存在:

  • 启动MySQL容器时通过MYSQL_DATABASE=employeedb环境变量自动创建,或者手动进入MySQL容器执行CREATE DATABASE employeedb;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:15:07