Gradle构建SpringBoot项目Docker镜像时测试环节连接报错
问题:Docker构建SpringBoot镜像时测试阶段数据库连接失败
错误日志
ApplicationTests > contextLoads() FAILED 80.30 java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 80.30 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractBeanFactory.java:326 80.30 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1788 80.30 Caused by: liquibase.exception.UnexpectedLiquibaseException at SpringLiquibase.java:259 80.30 Caused by: liquibase.exception.DatabaseException at SpringLiquibase.java:251 80.30 Caused by: org.postgresql.util.PSQLException at ConnectionFactoryImpl.java:346 80.30 Caused by: java.net.ConnectException at Net.java:-2
Dockerfile内容
FROM gradle:8-jdk17 AS build WORKDIR /app COPY build.gradle.kts ./ COPY settings.gradle.kts ./ COPY settings.gradle.kts ./ #COPY gradle ./gradle COPY src ./src RUN gradle build --no-daemon FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build /app/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
build.gradle.kts配置
plugins { id("org.springframework.boot") version "3.3.0" id("io.spring.dependency-management") version "1.1.5" kotlin("plugin.jpa") version "1.9.24" kotlin("jvm") version "1.9.24" kotlin("plugin.spring") version "1.9.24" } group = "com.delivery" version = "0.0.1-SNAPSHOT" java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.liquibase:liquibase-core") implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server") implementation("org.springframework.boot:spring-boot-starter-security") implementation("com.google.firebase:firebase-admin:9.3.0") developmentOnly("org.springframework.boot:spring-boot-devtools") implementation("org.springframework.boot:spring-boot-starter-amqp") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testImplementation("org.springframework.security:spring-security-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } kotlin { compilerOptions { freeCompilerArgs.addAll("-Xjsr305=strict") } } tasks.withType<Test> { useJUnitPlatform() }
解决方案
方案1:构建阶段跳过测试
Docker构建过程中,测试代码会尝试连接PostgreSQL数据库,但此时容器内没有运行数据库实例,直接导致连接失败。修改Dockerfile中的构建命令,添加-x test参数跳过测试:
RUN gradle build --no-daemon -x test
同时清理Dockerfile里重复复制的settings.gradle.kts行,修改后完整内容:
FROM gradle:8-jdk17 AS build WORKDIR /app COPY build.gradle.kts ./ COPY settings.gradle.kts ./ #COPY gradle ./gradle COPY src ./src RUN gradle build --no-daemon -x test FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build /app/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
方案2:配置测试使用嵌入式数据库
如果希望保留测试环节,可以配置测试环境使用H2嵌入式数据库,避免依赖外部PostgreSQL:
- 在
src/test/resources下创建application-test.yml,添加配置:
spring: datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: create-drop show-sql: true liquibase: enabled: false # 若需在测试环境执行Liquibase,可单独配置测试用changelog
- 在
build.gradle.kts的dependencies中添加H2测试依赖:
testImplementation("com.h2database:h2")
这样测试阶段会自动使用H2数据库,无需连接外部PostgreSQL,即可正常完成测试并构建镜像。
内容的提问来源于stack exchange,提问作者user9132502
相关产品推荐
相关产品推荐

