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
相关产品推荐
相关产品推荐

