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

Docker-Compose测试服务异常:指定命令未执行却启动应用

问题分析与解决:Docker-Compose Tests服务启动应用而非执行测试

核心原因

  1. ENTRYPOINT与COMMAND的冲突:你的Dockerfile最终镜像中定义了ENTRYPOINT ["java", "-jar", "/app/application.jar"],而docker-compose里的command会作为ENTRYPOINT的参数追加执行,而非替换ENTRYPOINT。实际执行的命令变成了:

    java -jar /app/application.jar /app/gradlew clean test --info
    

    这会导致Spring Boot应用依然启动,后面的参数被当成应用的启动参数,自然不会执行测试。

  2. 测试所需文件缺失:最终镜像只复制了BUILD_IMAGE阶段的application.jar,没有包含gradlew、build.gradle.kts、源码等测试必需的文件,即使命令能执行,也找不到/app/gradlew和测试代码。

解决方案

方案一:使用构建阶段镜像运行测试

直接让tests服务使用Dockerfile中的BUILD_IMAGE阶段(该阶段包含所有测试依赖和文件),无需构建最终应用镜像:

修改docker-compose.yml的tests服务:

tests:
  build:
    context: .
    target: BUILD_IMAGE  # 指定使用构建阶段的镜像
  depends_on:
    - postgres
  environment:
    - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/mydatabase
    - SPRING_DATASOURCE_USERNAME=user
    - SPRING_DATASOURCE_PASSWORD=pass
  command: ./gradlew clean test --info

方案二:覆盖ENTRYPOINT并补充测试文件

如果必须使用最终镜像,需要先修改Dockerfile,将测试所需文件复制到最终镜像,然后在docker-compose中覆盖ENTRYPOINT:

修改Dockerfile:

FROM adoptopenjdk/openjdk11:debian-slim as BUILD_IMAGE

ENV APP_HOME /app
WORKDIR $APP_HOME

COPY build.gradle.kts .
COPY settings.gradle.kts .
COPY src ./src
ADD gradlew .
ADD gradle ./gradle

RUN ./gradlew clean build -x test

# Final Docker Image
FROM adoptopenjdk/openjdk11:debian-slim
WORKDIR /app

# 复制测试所需文件
COPY --from=BUILD_IMAGE /app/gradlew .
COPY --from=BUILD_IMAGE /app/gradle ./gradle
COPY --from=BUILD_IMAGE /app/build.gradle.kts .
COPY --from=BUILD_IMAGE /app/settings.gradle.kts .
COPY --from=BUILD_IMAGE /app/src ./src
COPY --from=BUILD_IMAGE /app/build/libs/application.jar ./

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app/application.jar"]

修改docker-compose.yml的tests服务:

tests:
  build: .
  depends_on:
    - postgres
  environment:
    - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/mydatabase
    - SPRING_DATASOURCE_USERNAME=user
    - SPRING_DATASOURCE_PASSWORD=pass
  entrypoint: []  # 清空ENTRYPOINT
  command: ./gradlew clean test --info

内容的提问来源于stack exchange,提问作者Cap.Alvez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:33:24