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

Docker部署Spring Boot应用时HikariPool无错自动关闭问题求助

问题:Spring Boot Docker容器启动后HikariPool自动关闭

Spring Boot应用通过Docker启动,连接同Docker环境的MySQL数据库时,HikariPool初始化完成后立刻无错误自动关闭。但在IDEA中直接运行应用、搭配Docker启动的MySQL时一切正常。

相关配置及日志

docker-compose.yml

application:
  image: com.moovie.info.service/application
  restart: always
  ports:
    - '8080:8080'
  depends_on:
    - cache
    - database
  environment:
    SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/statistics?useSSL=false&allowPublicKeyRetrieval=true
    SPRING_DATASOURCE_PASSWORD: secret
    SPRING_JPA_HIBERNATE_DDL_AUTO: update
    LOGGING_LEVEL: TRACE
  networks:
    - application

database:
  hostname: database
  image: mysql:8.4.0
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: statictics
    MYSQL_PASSWORD: secret
  volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql
  networks:
    - application

networks:
  application:
    name: 'application'

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.5'
    id 'io.spring.dependency-management' version '1.1.4'

    id 'com.palantir.docker' version '0.36.0'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

group = 'com.moovie.info.service'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

configurations {
    all*.exclude group: 'commons-logging', module: 'commons-logging'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa',
                   'org.springframework.boot:spring-boot-starter-web',
                   'org.springframework.boot:spring-boot-starter-data-redis',
                   'redis.clients:jedis',
                   'org.springframework.boot:spring-boot-docker-compose',
                   'com.mysql:mysql-connector-j:8.4.0'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    compileOnly 'org.projectlombok:lombok:1.18.32'

    annotationProcessor 'org.projectlombok:lombok:1.18.20'
}

test {
    useJUnitPlatform()
}

shadowJar {
    zip64 true
}

docker {
    def dockerName = "${project.group}/${project.name}".toLowerCase()

    name dockerName

    dockerfile file('docker/Dockerfile')
    files shadowJar.archiveFile.get(),
            buildArgs([
                    jarFileName   : "${shadowJar.archiveFileName.get()}"
            ])
}

dockerPrepare {
    dependsOn shadowJar
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.movie.info.service.application.web.Application'
        )
    }
}

java {
    withJavadocJar()
    withSourcesJar()
}

Spring日志

2024-05-23T09:19:45.660Z  INFO   --- [           main] c.m.i.s.application.web.Application      : Starting Application using Java 17.0.2 with PID 7 (/app.jar started by root in /)
2024-05-23T09:19:45.665Z  INFO   --- [           main] c.m.i.s.application.web.Application      : No active profile set, falling back to 1 default profile: "default"
2024-05-23T09:19:46.406Z  INFO   --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2024-05-23T09:19:46.534Z  INFO   --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 111 ms. Found 1 Redis repository interface.
2024-05-23T09:19:46.539Z  INFO   --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-05-23T09:19:46.590Z  INFO   --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 46 ms. Found 1 JPA repository interface.
2024-05-23T09:19:47.387Z  INFO   --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-05-23T09:19:47.422Z  INFO   --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version [WORKING]
2024-05-23T09:19:47.446Z  INFO   --- [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2024-05-23T09:19:47.659Z  INFO   --- [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-05-23T09:19:47.687Z  INFO   --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-05-23T09:19:47.888Z  INFO   --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@111cba40
2024-05-23T09:19:47.891Z  INFO   --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-05-23T09:19:48.757Z  INFO   --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-05-23T09:19:48.807Z  INFO   --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-05-23T09:19:49.672Z  INFO   --- [           main] c.m.i.s.application.web.Application      : Started Application in 4.216 seconds (process running for 4.655)
2024-05-23T09:19:49.693Z  INFO   --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2024-05-23T09:19:49.697Z  INFO   --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2024-05-23T09:19:49.705Z  INFO   --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

解决步骤

1. 移除/禁用spring-boot-docker-compose依赖

你的build.gradle中引入了spring-boot-docker-compose模块,该模块设计用于自动启动Docker Compose服务,但在外部已通过Docker Compose启动容器的场景下,它会判定服务已就绪,随即触发应用自动关闭。

  • 方案一:直接从build.gradle的dependencies中删除'org.springframework.boot:spring-boot-docker-compose'
  • 方案二:在Docker环境变量中添加禁用配置:
    SPRING_DOCKER_COMPOSE_ENABLED=false
    

2. 修正数据库名称拼写错误

docker-compose.yml中存在数据库名拼写不一致:

  • 应用配置的数据库名是statistics
  • MySQL容器配置的MYSQL_DATABASE是statictics(多了一个t)
    修正MySQL容器的环境变量:
MYSQL_DATABASE: statistics

3. 优化Docker Compose依赖健康检查

depends_on仅保证容器启动顺序,不保证MySQL服务完全就绪。添加健康检查确保MySQL可用后再启动应用:
修改database服务配置:

database:
  # 原有配置...
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
    interval: 5s
    timeout: 5s
    retries: 5

修改application服务的depends_on:

depends_on:
  cache:
    condition: service_started
  database:
    condition: service_healthy

4. 验证Docker镜像打包完整性

确保Dockerfile正确加载shadowJar生成的包,例如:

FROM openjdk:17-jdk-slim
WORKDIR /app
ARG jarFileName
COPY ${jarFileName} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:02:35