Docker-Compose部署SpringBoot连接MySQL失败求助
问题排查与解决方案
1. 数据库用户连接权限限制
MySQL 8.0默认创建的用户仅允许localhost连接,而Spring Boot应用运行在独立Docker容器中,通过db主机名发起连接属于远程访问场景,admin用户默认没有该权限,这是连接超时的核心原因之一。
解决方法:
- 添加初始化授权脚本:在项目根目录创建
init.sql文件,写入以下内容:
然后在GRANT ALL PRIVILEGES ON angelodaleoptdb.* TO 'admin'@'%'; FLUSH PRIVILEGES;docker-compose.yml的db服务中挂载该脚本:db: # ... 原有配置 volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql - 修改健康检查命令:直接验证
admin用户的连接权限,替换原有健康检查配置:healthcheck: test: ["CMD", "mysql", "-uadmin", "-proot", "-h", "localhost", "-e", "SELECT 1"] interval: 10s retries: 5 timeout: 5s
2. 确认Spring Boot环境变量生效
虽然docker-compose.yml中配置了SPRING_DATASOURCE_*环境变量,但需确保Spring Boot正确加载并覆盖application.properties的默认配置。可以在应用启动日志中搜索DataSource关键字,确认实际使用的URL、用户名是否为jdbc:mysql://db:3306/angelodaleoptdb和admin。
若环境变量未生效,可在application.properties中添加占位符增强兼容性:
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/angelodaleoptdb?useSSL=false&serverTimezone=UTC} spring.datasource.username=${SPRING_DATASOURCE_USERNAME:root} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:admin}
3. 调整连接池与数据库初始化配置
当前connectionTimeout设置为100秒过长,且MySQL容器启动后可能需要额外时间完成数据库初始化,可优化参数:
- 将
spring.datasource.hikari.connectionTimeout调整为30000ms(30秒) - 保留
initializationFailTimeout=0,允许连接池初始化失败后自动重试
4. 验证容器网络连通性
手动进入Spring Boot容器测试与db服务的连通性,排查网络问题:
# 进入app容器 docker exec -it <你的app容器名称> sh # 安装mysql客户端(若容器未预装) apt update && apt install -y mysql-client # 测试连接 mysql -h db -u admin -p root
若连接失败,可在docker-compose.yml中显式指定自定义网络:
version: '3.8' networks: app-network: driver: bridge services: app: # ... 原有配置 networks: - app-network db: # ... 原有配置 networks: - app-network
5. 清理无效MySQL环境变量
db服务中的DATABASE_HOST和DATABASE_PORT属于无效配置(MySQL官方镜像不识别),建议删除以避免混淆。
内容的提问来源于stack exchange,提问作者Andrea Internullo
相关产品推荐
相关产品推荐

