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
相关产品推荐
相关产品推荐

