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

Spring Boot Docker容器无法通过JDBC连接MySQL求助

Spring Boot无法连接Docker Compose中的MySQL数据库问题排查与解决

我用Docker Compose部署了Spring Boot、MySQL、Angular前端和Python推荐系统容器,前端和推荐系统运行正常,但Spring Boot后端一直报JDBC连接失败错误。尝试让Spring Boot容器连接同Compose下的MySQL容器,始终无法成功。

以下是针对性的排查和解决步骤:

  • 优化MySQL健康检查逻辑
    当前healthcheck仅检测MySQL进程存活,可能数据库尚未完成初始化(如指定库HealthAndFitnessPlatform未创建完成)。修改为直接验证数据库可访问:

    healthcheck:
      test: ["CMD-SHELL", "mysql -h localhost -u root -p12345678 -e 'USE HealthAndFitnessPlatform;'"]
      timeout: 20s
      retries: 10
    
  • 确认MySQL用户访问权限
    进入MySQL容器,验证root用户是否允许外部访问:

    docker exec -it DataBaseContainer mysql -u root -p12345678
    

    执行查询:

    SELECT host, user FROM mysql.user;
    

    若root用户的host不是%,执行授权:

    ALTER USER 'root'@'%' IDENTIFIED BY '12345678';
    FLUSH PRIVILEGES;
    
  • 用环境变量覆盖数据库配置
    在Docker Compose的back-end服务中添加环境变量,避免硬编码配置可能带来的不一致:

    back-end:
      # 其他配置保持不变
      environment:
        - SPRING_PROFILES_ACTIVE=dev
        - SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/HealthAndFitnessPlatform?useSSL=false&serverTimezone=UTC
        - SPRING_DATASOURCE_USERNAME=root
        - SPRING_DATASOURCE_PASSWORD=12345678
    
  • 验证容器网络连通性
    进入Spring Boot容器,测试与MySQL服务的网络连通:

    docker exec -it BackEndContainer ping database
    

    若ping不通,检查容器是否在同一网络:

    docker network inspect common_network
    
  • 确认MySQL驱动是否存在
    检查Spring Boot的pom.xml是否包含驱动依赖:

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    

    确保打包后的jar包包含该依赖。


相关配置文件

Docker Compose配置

back-end:
  container_name: BackEndContainer
  build:
    context: .
    dockerfile: HealthAndFitnessPlatformJava/Dockerfile
  ports:
    - "8080:8080"
  networks:
    - common_network
  environment:
    - SPRING_PROFILES_ACTIVE=dev
  volumes:
    - ./target:/app
  depends_on:
    database:
      condition: service_healthy
  restart: unless-stopped

database:
  container_name: DataBaseContainer
  image: mysql:latest
  ports:
    - "3307:3306"
  environment:
    MYSQL_ROOT_PASSWORD: 12345678
    MYSQL_DATABASE: HealthAndFitnessPlatform
  networks:
    - common_network
  volumes:
    - MYSQL_volume:/var/lib/mysql
  restart: unless-stopped
  healthcheck:
    test: [ "CMD-SHELL", "mysqladmin ping -h localhost -u root -p12345678" ]
    timeout: 20s
    retries: 10

front-end:
  container_name: FrontEndContainer
  build:
    context: .
    dockerfile: HealthAndFitnessPLatformNG/Dockerfile
  ports:
    - "4200:4200"
  networks:
    - common_network
  depends_on:
    - back-end
  restart: unless-stopped

recommend:
  container_name: RecommendContainer
  build:
    context: ./HealthAndFitnessPYTHON
    dockerfile: Dockerfile
  networks:
    - common_network
  depends_on:
    - back-end
  restart: unless-stopped


volumes:
MYSQL_volume:

networks:
common_network:
  driver: bridge

Spring Boot Dockerfile

FROM openjdk:17-jdk-slim

COPY HealthAndFitnessPlatformJava/target/HealthAndFitnessPlatform-0.0.1-SNAPSHOT.jar HealthAndFitnessPlatform.jar

WORKDIR .

CMD ["java","-jar","HealthAndFitnessPlatform.jar"]

application.properties配置

spring.application.name=HealthAndFitnessPlatform

#MYSQL CONFIG
spring.datasource.url=jdbc:mysql://database:3306/HealthAndFitnessPlatform
spring.datasource.username=root
spring.datasource.password=12345678
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#HIBERNATE CONFIGURATION
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

spring.jpa.hibernate.ddl-auto=update
## spring.jpa.show-sql=true

#DEVTOOLS CONFIGURATION
spring.devtools.restart.enabled=true

#JWT CONFIGURATION
jwt.key = c14f070c6c1fdc6905289a6a59f127611ceeb49481e25048c3dc1c9aa6ddbf5dec98114a2998ffbe33283a65e0445bdb6c4dcafe7f9c22c5367ea2c0c4ed8efd0304f302368ffc3ff3e4b46900f79e3dad4dfd9a430e3db3ea5cb1c35620d5c3e5d52359aab04cfb6824b5a6b2ae2bc694e9d62622ee3c53f1746c17b8b40fad

#for uploading images
file.upload-dir=uploads/images

spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=5MB


spring.datasource.hikari.initialization-fail-timeout=60000
spring.datasource.hikari.connection-timeout=30000

Angular Dockerfile

FROM node:alpine

WORKDIR /usr/src/app

COPY . /usr/src/app

RUN npm install -g @angular/cli

# 此处使用legacy-peer-deps参数强制解决依赖冲突
RUN npm install --legacy-peer-deps

CMD ["ng", "serve", "--host", "0.0.0.0"]

Python推荐系统Dockerfile

FROM python:3.10-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:16:06