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

Docker部署SpringBoot应用无法连接MySQL问题求助

Docker环境下SpringBoot连接MySQL失败的解决方法

问题描述

本地运行正常的SpringBoot应用,部署到Docker后抛出MySQL连接错误,核心错误日志:

Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'javax.persistence.jdbc.url', 'hibernate.connection.url', or 'hibernate.dialect')

本质是SpringBoot无法连接到MySQL数据库,导致Hibernate无法获取JDBC元数据确定方言。

错误原因分析

  1. 容器间通信端口错误:Docker Compose中,容器间通信使用容器内部端口,而非宿主机映射端口。你的MySQL容器内部端口是3306,却在SpringBoot的连接URL中用了宿主机映射的3307。
  2. 数据库初始化未完成:depends_on仅保证MySQL容器启动,但不保证数据库服务完全就绪,SpringBoot启动时可能MySQL还在初始化。
  3. Expose端口配置错误:MySQL容器内部运行在3306端口,你却expose了3307,虽然不影响容器间通信,但属于配置错误。
  4. 环境变量覆盖不完整:仅覆盖了数据库URL,用户名和密码未通过环境变量明确传递(虽然application.properties中有,但统一用环境变量更可靠)。

具体修正步骤

1. 修正Docker Compose配置

修改docker-compose.yml,调整数据库连接URL、补充环境变量、修正expose端口:

version: '3.9'

services:
  skm-server:
    build:
      context: sri-kula-medura-server
      dockerfile: Dockerfile
    ports: 
      - "8080:8080"
    networks:
      - skm
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://skmdb:3306/skm_db?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_USERNAME: skm_user
      SPRING_DATASOURCE_PASSWORD: password
    depends_on:
      - skmdb
    # 可选:添加等待MySQL就绪的脚本,需确保镜像包含curl
    # entrypoint: ["sh", "-c", "until curl -s skmdb:3306; do sleep 2; done; java -jar /app.jar"]

  skmdb:
    image: mysql
    restart: always
    networks:
      - skm
    environment:
      MYSQL_DATABASE: 'skm_db'
      MYSQL_USER: 'skm_user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - '3307:3306'
    expose:
      - '3306'  # 修正为容器内部端口
    volumes:
      - skm-db:/var/lib/mysql

networks:
  skm:
volumes:
  skm-db:

2. 优化application.properties配置

将配置改为支持环境变量覆盖的形式,本地和Docker环境自动适配:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3307/skm_db?createDatabaseIfNotExist=true}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:skm_user}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:password}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
# 可选:添加连接池配置,增加等待时间
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10

3. 额外优化:确保MySQL初始化完成

如果SpringBoot还是因为MySQL未就绪启动失败,可以:

  • 在SpringBoot配置中添加spring.datasource.hikari.connection-test-query=SELECT 1
  • 或者修改Dockerfile,添加等待脚本:
FROM eclipse-temurin:17-jdk-alpine
RUN apk add --no-cache curl
VOLUME /tmp
COPY target/*.jar app.jar
# 等待MySQL就绪后启动应用
ENTRYPOINT ["sh", "-c", "until curl -s skmdb:3306 > /dev/null; do sleep 2; echo 'Waiting for MySQL...'; done; java -jar /app.jar"]

验证方法

  1. 停止并删除现有容器:docker-compose down
  2. 重新构建并启动:docker-compose up --build
  3. 查看日志:docker-compose logs -f skm-server,确认连接成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:56:11