Docker环境下SpringBoot+MySQL+Flyway启动失败求助
问题排查与解决方案
1. 数据库账号密码完全不匹配
你的MySQL启动命令中设置的根用户是sa、密码是1234,但application.yml里配置的数据库账号是root、密码是rootpass,这是核心错误,直接导致连接失败。
修改application.yml的数据源配置,和MySQL容器的环境变量保持一致:
spring: datasource: url: jdbc:mysql://mysqldb:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC driverClassName: com.mysql.cj.jdbc.Driver username: sa password: 1234
额外添加
allowPublicKeyRetrieval=true解决MySQL 8.0+驱动的公钥检索限制,serverTimezone=UTC避免时区不兼容报错。
2. MySQL未就绪时SpringBoot提前启动
MySQL容器启动后需要1-2分钟完成数据库初始化,SpringBoot启动过快会触发连接拒绝。解决方式:
- 手动等待:启动MySQL容器后,等待1-2分钟再启动SpringBoot容器
- 用Docker Compose做健康检查(推荐):
编写docker-compose.yml,让SpringBoot仅在MySQL完全就绪后启动:
执行version: '3.8' services: mysqldb: image: mysql:latest container_name: mysqldb networks: - my-net environment: MYSQL_ROOT_USER: sa MYSQL_ROOT_PASSWORD: 1234 MYSQL_DATABASE: mydb healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "sa", "-p1234"] interval: 5s timeout: 5s retries: 5 manager-app: image: manager-app container_name: manager-app networks: - my-net ports: - "8080:8080" depends_on: mysqldb: condition: service_healthydocker-compose up -d即可自动处理启动顺序。
3. 验证网络连通性
先确认自定义网络my-net存在:
docker network ls
如果不存在,先创建网络:
docker network create my-net
再进入SpringBoot容器测试能否连通MySQL:
docker exec -it manager-app ping mysqldb
如果ping不通,检查两个容器是否确实加入了my-net网络:
docker inspect mysqldb | grep Networks docker inspect manager-app | grep Networks
4. 检查MySQL服务状态
如果以上步骤都没问题,查看MySQL容器日志,确认服务是否正常启动:
docker logs mysqldb
若日志显示启动失败,可尝试更换和驱动版本匹配的MySQL镜像(比如mysql:8.0.31,和你的mysql-connector-java版本一致),避免版本兼容性问题。
内容的提问来源于stack exchange,提问作者continuousLearner
相关产品推荐
相关产品推荐

