Docker容器化SpringBoot应用无法连接同docker-compose下MariaDB问题咨询
问题原因
- 启动顺序不匹配:
depends_on仅控制容器的启动先后顺序,不会等待MariaDB完成内部初始化流程。MariaDB容器启动后需要几十毫秒到几秒的时间完成配置加载、用户创建、端口监听等逻辑,此时SpringBoot应用已经启动并发起连接请求,就会收到连接拒绝的报错。 - 环境变量覆盖失效:如果SpringBoot镜像打包时硬编码了配置,或者使用了优先级高于环境变量的配置源(比如 jar 包外放置的优先级更高的配置文件),会导致你设置的
spring.datasource.url环境变量没有生效,应用还是使用localhost地址发起连接,容器内自然无法连通数据库。 - 本地残留数据异常:你挂载的本地目录
./out/users_db如果存在之前运行生成的旧数据库文件,可能会导致MariaDB启动异常、端口监听失败,无法正常接受连接。
解决方案
- 配置容器健康检查,确保数据库就绪后再启动应用
修改docker-compose.yml的对应配置即可:
services: users: image: <MY_HOST>/users:0.0.1-SNAPSHOT container_name: users environment: spring.datasource.url: jdbc:mariadb://users-db:3306/users ports: - "9003:9003" depends_on: users-db: condition: service_healthy networks: - my-network users-db: image: mariadb:10.6.4 restart: always container_name: users-db environment: MYSQL_ROOT_PASSWORD: admin MYSQL_DATABASE: users MYSQL_USER: testuser MYSQL_PASSWORD: test ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password networks: - my-network volumes: - ./out/users_db:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "testuser", "-ptest"] interval: 3s timeout: 10s retries: 10
- 验证环境变量是否生效
服务启动后执行命令进入SpringBoot容器:docker exec -it users bash,执行printenv | grep spring.datasource.url,确认输出的连接地址为jdbc:mariadb://users-db:3306/users即可。 - 清理残留数据测试
先执行docker-compose down -v停止并删除相关容器、匿名卷,再清空本地的./out/users_db目录,最后执行docker-compose up -d重新启动服务即可。 - 可选:配置SpringBoot连接重试
在application.properties中添加配置,延长连接超时时间:
spring.datasource.hikari.connection-timeout=30000
如果还是偶现连接失败,可以引入spring-retry依赖,配置数据库连接失败自动重试。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

