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

Docker中Spring Boot连接MySQL报错:数据库访问被拒及连接失败

问题分析与解决方案

核心原因是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:11