Docker中Spring Boot连接MySQL报错:数据库访问被拒及连接失败
问题分析与解决方案
1. 首次启动的Communications link failure错误
核心原因是Spring Boot服务启动速度快于MySQL容器的初始化完成时间,当Spring Boot尝试建立数据库连接时,MySQL还未完全就绪,触发连接超时。
解决办法:
- 在
docker-compose.yaml中为Spring Boot服务添加依赖健康检查,确保MySQL完全就绪后再启动应用:services: mysql: image: mysql:8.0 environment: MYSQL_DATABASE: springapp MYSQL_USER: www_data MYSQL_PASSWORD: pass MYSQL_ROOT_PASSWORD: root_pass healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot_pass"] interval: 5s timeout: 5s retries: 10 spring-boot-app: build: . depends_on: mysql: condition: service_healthy - 或在Spring Boot的
application.properties中添加连接重试配置,让应用自动等待MySQL就绪:spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.initialization-fail-timeout=0 # 无限重试直到连接成功
2. 第二次启动的Access denied错误
该问题通常由以下几种场景导致:
场景1:MySQL初始化未完成,数据卷残留异常状态
首次启动中途中断时,MySQL的数据卷可能已生成,但用户/数据库的初始化流程未执行完毕,导致后续启动时用户权限或数据库不存在。
解决办法:
- 删除MySQL关联的数据卷,重新执行初始化:
docker compose down -v # -v 参数会删除所有关联的匿名卷 docker compose up
场景2:MySQL 8.0+密码加密算法兼容问题
MySQL 8.0默认使用caching_sha2_password加密算法,部分旧版本JDBC驱动不支持该算法,导致认证失败。
解决办法:
- 在
docker-compose.yaml的MySQL环境变量中强制使用旧加密方式:mysql: image: mysql:8.0 environment: MYSQL_DATABASE: springapp MYSQL_USER: www_data MYSQL_PASSWORD: pass MYSQL_ROOT_PASSWORD: root_pass MYSQL_DEFAULT_AUTH: mysql_native_password
场景3:用户权限未正确配置
即使通过环境变量指定了用户,仍可能出现权限未同步到目标数据库的情况,可通过初始化脚本手动配置:
- 在项目根目录创建
init.sql文件:CREATE DATABASE IF NOT EXISTS springapp; CREATE USER IF NOT EXISTS 'www_data'@'%' IDENTIFIED BY 'pass'; GRANT ALL PRIVILEGES ON springapp.* TO 'www_data'@'%'; FLUSH PRIVILEGES; - 在
docker-compose.yaml中挂载该脚本到MySQL的初始化目录:mysql: image: mysql:8.0 volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql environment: MYSQL_ROOT_PASSWORD: root_pass
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

