Docker Compose部署SpringBoot+MySQL时数据库连接创建失败问题
解决SpringBoot + Docker Compose连接MySQL失败的问题
遇到的错误:java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up
下面是具体问题排查和解决方案:
1. 数据库连接地址的配置问题
问题点:
- docker-compose.yaml里的环境变量格式错误:
-SPRING_DATASOURCE_URL: ...写法不符合Compose环境变量规范,应该用「空格+等号」的形式;同时URL里的&是HTML转义字符,YAML中直接用&即可。 - application.properties中配置的
spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=UTC在Docker容器内无效——容器的localhost指向自身,无法访问Compose网络中的MySQL服务,必须用服务名mysqldb作为连接地址。
修正:
在docker-compose.yaml的project服务中,正确配置环境变量覆盖连接地址:
environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/spring?autoReconnect=true&useSSL=false&serverTimezone=UTC
2. MySQL版本与Hibernate方言不兼容
问题点:
你使用的是MySQL 8镜像,但application.properties里配置的是org.hibernate.dialect.MySQL5Dialect,这会导致连接时的方言适配错误。
修正:
把方言改为MySQL 8对应的版本,可通过环境变量覆盖或直接修改application.properties:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
3. MySQL未就绪时SpringBoot提前启动
问题点:
depends_on仅保证MySQL服务先启动,但不保证MySQL完成初始化、可以接受连接。SpringBoot启动时MySQL还没准备好,就会出现连接失败重试后放弃的错误。
修正:
给MySQL服务添加健康检查,让SpringBoot在MySQL就绪后再启动:
在docker-compose.yaml的mysqldb服务中添加健康检查配置:
healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"] interval: 5s timeout: 5s retries: 5
同时修改project服务的depends_on,依赖MySQL的健康状态:
depends_on: mysqldb: condition: service_healthy
最终完整配置
docker-compose.yaml
version: "3.8" services: project: build: . ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/spring?autoReconnect=true&useSSL=false&serverTimezone=UTC - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=1234 - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL8Dialect depends_on: mysqldb: condition: service_healthy mysqldb: image: mysql:8 ports: - 33066:3306 environment: - MYSQL_ROOT_PASSWORD=1234 - MYSQL_DATABASE=spring volumes: - spring:/data/db healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"] interval: 5s timeout: 5s retries: 5 volumes: spring:
application.properties(可简化,环境变量会覆盖对应配置)
spring.jpa.database=mysql server.error.include-message=always server.error.include-binding-errors=always spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto = create
内容的提问来源于stack exchange,提问作者Morphelia
相关产品推荐
相关产品推荐

