Docker Compose部署SpringBoot与MySQL容器时服务无法连接数据库问题
问题根源
该场景下数据库连接失败由三类问题共同导致:
- 账号密码配置不匹配:MySQL容器通过环境变量
MYSQL_ROOT_PASSWORD: root设置的root用户初始密码为root,但Spring Boot服务配置的数据库连接密码为sh123,密码校验直接不通过。 - 依赖启动逻辑存在缺陷:Docker Compose原生的
depends_on配置仅控制容器启动顺序,不会等待MySQL完成初始化流程。MySQL 8.0首次启动需要执行数据目录初始化、权限表加载、系统库创建等操作,耗时10~30秒不等,Spring Boot服务在容器启动后立即尝试建立数据库连接,此时MySQL尚未就绪接收请求,就会触发多次重试后放弃连接的报错。 - Spring数据源配置项命名错误:Spring Boot默认识别JDBC连接地址的环境变量为
SPRING_DATASOURCE_URL,配置中写的SPRING_DATA_URL属于自定义命名,如果应用内没有额外做环境变量映射,Spring无法读取到你配置的容器内MySQL连接地址,会默认尝试连接本地数据库,进一步加剧连接失败问题。 - 补充说明:同Docker网络下容器间访问MySQL直接走3306端口的配置是正确的,
3308:3306的端口映射仅用于宿主机访问数据库,不是本次故障的诱因。
修复方案
- 统一两边的密码配置:要么将MySQL容器的
MYSQL_ROOT_PASSWORD值改为sh123,要么将Spring服务侧的数据库密码配置改为root,保证凭据一致。 - 修正Spring Boot环境变量命名,使用Spring Boot默认识别的标准配置名:连接地址对应
SPRING_DATASOURCE_URL、用户名对应SPRING_DATASOURCE_USERNAME、密码对应SPRING_DATASOURCE_PASSWORD、激活配置对应SPRING_PROFILES_ACTIVE、服务端口对应SERVER_PORT,避免自定义变量名导致配置不生效。 - 给MySQL服务增加健康检查,将
depends_on改为等待MySQL健康状态就绪后再启动Spring服务,同时在JDBC连接串中增加allowPublicKeyRetrieval=true参数,解决MySQL 8.0默认身份验证插件的公钥检索问题。
修正后的核心Docker Compose配置片段如下:
version: '3.9' services: mysql: image: mysql:8.0 container_name: mysql_DB ports: - "3308:3306" environment: MYSQL_ROOT_PASSWORD: sh123 MYSQL_DATABASE: delivery volumes: - ~/apps/mysql1:/var/lib/mysql networks: - dev-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-psh123"] interval: 5s timeout: 5s retries: 10 prioritization-service: image: sh/prioritization-service:1.0 ports: - "9085:8085" depends_on: mysql: condition: service_healthy environment: SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: sh123 SERVER_PORT: 8085 SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/delivery?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true SPRING_PROFILES_ACTIVE: development,data networks: - dev-network networks: dev-network:
内容的提问来源于stack exchange,提问作者ShefZee
相关产品推荐
相关产品推荐

