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

Docker Compose启动后未创建MySQL表,SpringBoot应用未运行求助

问题排查与解决方案

问题现象

学习Docker时搭建了一个基础CRUD SpringBoot应用(支持用户新增、按ID查询、查询全部),配置了Dockerfile和docker-compose.yml。执行docker-compose up后,镜像和容器均显示运行状态,但MySQL中未生成user表,怀疑SpringBoot应用未实际启动。

相关配置

Dockerfile

FROM openjdk:21
LABEL authors="MohammedKhadeer"
WORKDIR /usr/src/myapp
COPY . /usr/src/myapp/
#ENTRYPOINT ["java", "-jar","./target/docker-0.0.1-SNAPSHOT.jar"]
CMD ["java", "-jar","./target/docker-0.0.1-SNAPSHOT.jar"]

docker-compose.yml

services:
  mydb:
    image: mysql:latest
    container_name: mysql_database_latest
    environment:
      - MYSQL_DATABASE = docker-testing
      - MYSQL_USER =  admin
      - MYSQL_PASSWORD =  root
      - MYSQL_ROOT_PASSWORD =  root
    restart: unless-stopped
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - 3333:3306
    networks:
      - myapplication
  myapp:
    build: ./docker
    container_name: docker_boot_app
    depends_on:
      - mydb
    environment:
      - spring.datasource.url=jdbc:mysql://mydb:3306/docker-testing?createDatabaseIfNotExist=true
      - spring.datasource.username=admin
      - spring.datasource.password=root
    ports:
      - 8081:8080
    networks:
      - myapplication
networks:
  myapplication:

application.properties

spring.application.name=docker

#spring.datasource.url=jdbc:mysql://localhost:3306/docker-testing
#spring.datasource.username=admin
#spring.datasource.password=root

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

问题原因与修复步骤

1. MySQL环境变量格式错误

docker-compose.yml中MySQL的环境变量等号两侧存在空格,会导致变量值包含多余空格(比如MYSQL_DATABASE的值变成 docker-testing),引发数据库初始化异常,SpringBoot无法正常连接。

修复:去掉环境变量等号两侧的空格:

environment:
  - MYSQL_DATABASE=docker-testing
  - MYSQL_USER=admin
  - MYSQL_PASSWORD=root
  - MYSQL_ROOT_PASSWORD=root

2. 未等待MySQL服务就绪

depends_on仅保证容器启动顺序,不保证MySQL服务完全就绪。SpringBoot启动时如果MySQL还没完成初始化,会导致连接失败,应用启动失败。

修复方案:

  • 方案一:在SpringBoot应用中添加数据库连接重试逻辑,比如配置Hikari连接池的超时与重试,或引入spring-boot-starter-actuator配合健康检查。
  • 方案二:在docker-compose中为MySQL添加健康检查,让myapp容器等待MySQL健康后再启动:
mydb:
  # 其他配置不变
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5
myapp:
  depends_on:
    mydb:
      condition: service_healthy

3. Dockerfile构建时可能缺少jar包

Dockerfile中COPY . /usr/src/myapp/,如果构建上下文是./docker目录,而SpringBoot的jar包在宿主项目的target目录下,构建镜像时会找不到./target/docker-0.0.1-SNAPSHOT.jar。

修复方案:

  • 方案一:先在宿主机构建SpringBoot应用(执行mvn clean package),确保target目录在Dockerfile的构建上下文内,或调整COPY路径。
  • 方案二:使用多阶段构建,在Dockerfile中完成jar包构建:
# 第一阶段:构建jar包
FROM maven:3.9.6-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# 第二阶段:运行应用
FROM openjdk:21
LABEL authors="MohammedKhadeer"
WORKDIR /usr/src/myapp
COPY --from=builder /app/target/docker-0.0.1-SNAPSHOT.jar .
CMD ["java", "-jar","./docker-0.0.1-SNAPSHOT.jar"]

4. 检查SpringBoot应用启动日志

执行docker logs docker_boot_app查看应用启动日志,确认是否存在数据库连接失败、jar包找不到等错误,根据日志进一步定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:44:59