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

