Docker-Compose测试服务异常:指定命令未执行却启动应用
问题分析与解决:Docker-Compose Tests服务启动应用而非执行测试
核心原因
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应用依然启动,后面的参数被当成应用的启动参数,自然不会执行测试。
测试所需文件缺失:最终镜像只复制了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
相关产品推荐
相关产品推荐

