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

docker-compose部署Spring Boot服务时bootRun任务执行失败

故障定位

当前你截取的日志只显示了bootRun任务执行失败的表层结果,没有打印具体异常栈,结合你的配置,常见触发原因按出现概率排序如下:

  • Gradle任务名拼写错误:配置中写的bootrun是错误写法,Spring Boot Gradle插件的启动任务为驼峰命名的bootRun,小写开头的任务不存在,执行时会直接报错。
  • 数据库连接失败:depends_on配置仅能控制容器启动顺序,不会等待MySQL完成初始化就启动应用;另外容器内网络互通靠服务名做域名解析,如果你项目里数据库连接地址写的是localhost,会直接连不上MySQL服务。
  • 执行权限不足:你将本地./app目录挂载到容器工作目录,如果本地的gradlew脚本没有可执行权限,容器内运行脚本时会直接报权限拒绝。
  • JDK版本不匹配:如果你的Spring Boot版本是3.x及以上,最低依赖JDK17,你当前用的openjdk:11-jdk镜像无法运行高版本Spring Boot应用。
修复步骤
  1. 先获取完整错误日志精准定位问题,执行命令查看应用容器的全量日志:
docker logs spring-app
  1. 修正配置里的低级拼写错误,将app服务的启动命令改为正确写法:
command: ["./gradlew", "bootRun"]
  1. 修复数据库连接相关问题:
    • 检查项目的配置文件(application.yml或application.properties),将数据库连接地址的host改为db(即docker-compose中定义的MySQL服务名),端口保持3306,账号、密码、库名和你在db服务环境变量中配置的值保持一致。
    • 替换原有depends_on配置,增加服务健康检查逻辑,确保MySQL完全启动后再启动应用:
      先给db服务添加健康检查段:
      healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot_pw"]
        interval: 5s
        timeout: 5s
        retries: 10
      
      再修改app服务的依赖配置:
      depends_on:
        db:
          condition: service_healthy
      
  2. 给本地的gradlew脚本添加可执行权限,在你本地挂载的app项目根目录执行:
chmod +x gradlew
  1. 核对Spring Boot版本,如果是3.x版本,将app服务的基础镜像替换为openjdk:17-jdk。
实践建议
  • 不推荐直接挂载源码在容器内执行gradlew bootRun启动应用,更好的实践是编写Dockerfile将项目提前构建为可执行jar包,再用java -jar命令启动,启动速度更快、环境一致性更好。
  • 本地练习时如果用Windows或macOS系统挂载MySQL数据目录,注意关闭文件系统的权限继承,避免MySQL无法写入数据文件导致启动异常。

内容的提问来源于stack exchange,提问作者madol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:42:23