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

Spring Boot+MySQL应用Docker化部署报错:数据库连接失败

问题排查与解决方案

根据你提供的配置和错误信息,核心问题是Spring Boot容器无法连接到MySQL容器,以下是几个关键问题点及修复方案:

1. depends_on 不等待数据库完全就绪

Docker Compose的depends_on仅保证app容器在mysqldb之后启动,但MySQL容器启动后需要10-30秒完成数据库初始化、权限配置等流程,此时Spring Boot尝试连接必然失败。

修复方案:

  • 添加连接重试机制(推荐):在Spring Boot配置中增加连接池重试参数,让HikariCP自动重试连接:
    在application.properties或SPRING_APPLICATION_JSON中添加:
    spring.datasource.hikari.connection-timeout=30000
    spring.datasource.hikari.maximum-pool-size=5
    spring.datasource.hikari.validation-timeout=5000
    spring.datasource.hikari.connection-test-query=SELECT 1
    spring.datasource.hikari.test-on-borrow=true
    
  • 使用等待脚本:在Dockerfile中引入wait-for-it.sh脚本,等待MySQL端口就绪后再启动Spring Boot:
    下载脚本到项目根目录,修改Dockerfile:
    FROM maven:3.8.5-openjdk-17
    
    WORKDIR /app
    COPY . .
    RUN mvn clean install -DskipTests
    COPY wait-for-it.sh .
    RUN chmod +x wait-for-it.sh
    
    CMD ["./wait-for-it.sh", "mysqldb:3306", "--", "mvn", "spring-boot:run"]
    

2. Dockerfile的WORKDIR路径错误

你的Dockerfile中WORKDIR ../Task_adc_docker是无效的,镜像内的工作目录不能用相对上级路径,会导致后续COPY和mvn命令找不到文件。

修复方案:修改为镜像内的绝对路径:

FROM maven:3.8.5-openjdk-17

WORKDIR /app
COPY . .
RUN mvn clean install -DskipTests

CMD ["mvn", "spring-boot:run"]

(添加-DskipTests避免构建阶段测试连接数据库失败)

3. MySQL 5.7与JDBC驱动的兼容性问题

你使用的com.mysql.cj.jdbc.Driver是MySQL 8.0+的驱动类,虽然兼容5.7,但需要额外配置参数,且驱动版本不匹配可能导致连接失败。

修复方案:

  • 切换为MySQL 5.7对应的驱动类:在配置中将spring.datasource.driver-class-name改为com.mysql.jdbc.Driver
  • 更新pom.xml中的驱动版本(适配5.7):
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    
  • 在JDBC URL中添加allowPublicKeyRetrieval=true参数,解决驱动连接5.7时的权限问题:
    "jdbc:mysql://mysqldb:3306/task_adc?useSSL=false&allowPublicKeyRetrieval=true"
    

4. 环境变量解析验证

检查SPRING_APPLICATION_JSON中的环境变量是否正确替换:

docker-compose exec app env | grep SPRING_APPLICATION_JSON

如果变量未正确替换,确认.env文件与docker-compose.yml在同一目录,或者显式指定env_file路径:

env_file: ./path/to/.env

额外检查步骤

  1. 查看MySQL容器日志,确认初始化完成:
    docker-compose logs mysqldb
    
    找到ready for connections日志,表示MySQL已就绪。
  2. 验证app容器与mysqldb的网络连通性:
    docker-compose exec app ping mysqldb
    
    能ping通则网络正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:28:10