使用Docker Compose部署Spring Boot与MySQL时应用连接数据库失败如何解决
问题排查与解决方案
核心原因与对应修复方案
- MySQL进程未完全就绪,应用启动过早
depends_on仅保证容器的启动先后顺序,不会等待MySQL内部的库初始化、权限配置等操作完成就会启动应用容器,此时MySQL还未对外提供正常的数据库服务,导致连接失败。
解决方案:- 临时验证可以在应用的启动逻辑前增加等待时间,在docker-compose的
reminder-docker-container配置段增加如下配置:
command: ["sh", "-c", "sleep 15 && java -jar /你的应用jar包名称.jar"]- 生产环境建议增加端口检测逻辑,使用
wait-for-it等工具检测MySQL 3306端口就绪后再启动应用,同时可以配置Hikari连接池的重试参数,在应用的环境变量中增加:
- spring.datasource.hikari.initialization-fail-timeout=-1 - spring.datasource.hikari.connection-timeout=30000 - 临时验证可以在应用的启动逻辑前增加等待时间,在docker-compose的
- 应用未配置数据库鉴权信息
你当前的docker-compose配置中,应用容器仅配置了数据库连接URL,未配置对应的用户名和密码参数,Spring Boot无法通过鉴权连接数据库。
解决方案:在reminder-docker-container的environment段补充如下配置:
- spring.datasource.username=quartz - spring.datasource.password=quartz
- JDBC连接参数缺失/不兼容高版本MySQL
你使用的mysql:latest镜像为8.x版本,需要补充时区、公钥获取等参数,否则会出现连接异常。
解决方案:修改JDBC连接URL为如下内容:
jdbc:mysql://mysql-docker-container:3306/quartz?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
- MySQL默认认证插件和JDBC驱动版本不兼容
MySQL 8.x默认使用caching_sha2_password认证插件,如果你的应用中使用的MySQL JDBC驱动版本低于5.1.46,会不支持该认证方式导致连接失败。
解决方案:- 优先升级应用内的MySQL JDBC驱动到8.x版本,和数据库版本保持一致
- 也可以修改MySQL配置,强制使用旧版认证插件,在
mysql-docker-container配置段增加:
command: --default-authentication-plugin=mysql_native_password
内容的提问来源于stack exchange,提问作者Nits
相关产品推荐
相关产品推荐

