有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用带有Docker文件的Junit测试运行Springboot应用程序

现在我的Dockerfile如下所示:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

如果我想在启动springboot应用程序后运行一些junit测试呢?我正在使用Maven作为依赖项

我应该把这些线放在哪里

mvn test
mvn clean test
mvn clean compile test

或者我应该使用什么其他命令


共 (1) 个答案

  1. # 1 楼答案

    Premise: Even if the solution is oriented to your specifics it would be better to execute tests during target jar build phase

    要在Dockerfile上执行测试,可以执行以下操作之一:

    1. 还复制Dockerfile上的源文件,并执行maven测试命令。这样,您还可以直接在容器上构建目标jar,并且需要在容器上安装maven

    2. 只复制目标jar文件,并使用它来执行您需要在目标jar上包含测试类的测试。(见How can I include test classes into Maven jar and execute them?

    无论选择何种方式,都可以修改入口点以执行多个命令。基本上可以通过两种方式实现:

    1. (a)创建执行命令的bash脚本(参见Multiple commands on docker ENTRYPOINT
    2. (b)使用监督词(见How to write a Dockerfile which I can start a service and run a shell and also accept arguments for the shell?)。这是一个更好的解决方案,可以管理与容器寿命相关的流程(因此,PID为1的流程)

    Example

    假设您选择复制所有源文件(选项1)并使用bash 编写脚本(选项1(a))来执行此操作。 创建命令。sh文件如下,以便将容器连接到Spring应用程序进程,即使将执行mvn测试:

    #!/bin/bash
    
    #Execute Spring application
    CMD="java -jar target/app.jar"
    $CMD &
    SERVICE_PID=$!
    
    #Execute Tests
    mvn test
    
    #Wait for Spring execution
    wait "$SERVICE_PID"
    

    您的Dockerfile将如下所示:

    #Start from maven docker image
    FROM maven:3.6.1-jdk-8-alpine
    
    #Copy all sources
    COPY . .
    
    #Build ( because you want to execute tests after the spring boot application is started you should disable test during build phase )
    RUN mvn install
    
    #Start container
    COPY commands.sh /scripts/commands.sh
    RUN ["chmod", "+x", "/scripts/commands.sh"]
    ENTRYPOINT ["/scripts/commands.sh"]