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

Java 如何使用带有Docker文件的Junit测试运行Springboot应用程序,java,spring-boot,docker,maven,dockerfile,Java,Spring Boot,Docker,Maven,Dockerfile,现在我的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 或者我

现在我的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
或者我应该使用什么其他命令

前提:即使解决方案面向您的具体情况,最好在目标jar构建阶段执行测试

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

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

只复制目标jar文件并使用它来执行您需要在目标jar上包含测试类的测试。见

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

创建执行命令的bash脚本的步骤请参见 b.请参阅。这是一个更好的解决方案,可以管理与容器寿命相关的流程,因此流程的PID为1。 范例

假设您选择复制所有源文件选项1并使用bash 为选项1a编写脚本以执行此操作。 创建command.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"]
前提:即使解决方案面向您的具体情况,最好在目标jar构建阶段执行测试

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

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

只复制目标jar文件并使用它来执行您需要在目标jar上包含测试类的测试。见

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

创建执行命令的bash脚本的步骤请参见 b.请参阅。这是一个更好的解决方案,可以管理与容器寿命相关的流程,因此流程的PID为1。 范例

假设您选择复制所有源文件选项1并使用bash 为选项1a编写脚本以执行此操作。 创建command.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"]

要运行单元测试,您应该编写单元测试,这些测试将在运行期间执行。在将应用程序打包到jar文件之前构建应用程序。这通常通过mvn清洁测试完成。将单元测试放在src/test/java中,并将它们命名为*test.java。如果您有spring启动测试,您应该将它们命名为*IT.java,并将在集成测试阶段运行,该阶段可以通过mvn clean verify执行。此外,您应该了解构建生命周期是的,我已经在正确的目录中编写了junit测试。但是我想知道如何在docker文件中执行它如果你想执行测试构建,为什么要启动实际的应用程序?测试不能依赖于应用程序的运行,或者应用程序无法生成,或者我遗漏了什么?在docker文件中,要么你只打包你的最终应用程序,要么你在docker容器中生成…问题是:你想做什么?我正在尝试将springboot应用程序推送到travis ci,并在travis ci上运行junit测试。所以我需要在docker文件中定义命令来运行单元测试,您应该编写单元测试,这些测试将在运行期间执行。在将应用程序打包到jar文件之前构建应用程序。这通常通过mvn清洁测试完成。将单元测试放在src/test/java中,并将它们命名为*test.java。如果您有spring启动测试,您应该将它们命名为*IT.java,并将在集成测试阶段运行,该阶段可以通过mvn clean verify执行。此外,您应该了解构建生命周期是的,我已经在正确的目录中编写了junit测试。但是我想知道如何在docker文件中执行它如果你想执行测试构建,为什么要启动实际的应用程序?测试不能依赖于应用程序的运行,或者应用程序无法生成,或者我遗漏了什么?在docker文件中,要么你只打包你的最终应用程序,要么你在docker容器中生成…问题是:你想做什么?我正在尝试将springboot应用程序推送到travis ci,并在travis ci上运行junit测试。因此,我需要在docker文件/scripts/commands.sh中定义该命令:第11行:wait:“:不是pid或有效的作业规范?将空参数传递给wait命令时会发生这种情况。我的问题
在写入command.sh脚本时,缺少执行命令$CMD&。我将更新答案。请重试。嗨,我仍然对流程感到困惑。我在my docker文件中寻找以下成就:mvn安装、mvn测试和构建jar文件,我还使用此docker文件将其部署在aws elasticbean Stable上作为我的应用程序后端服务器。我的docker文件应该是什么样子?谢谢/scripts/commands.sh:第11行:wait:“:不是pid或有效的作业规范?将空参数传递给wait命令时会发生这种情况。我在编写command.sh脚本时遇到的问题缺少执行命令$CMD&。我将更新答案。请重试。嗨,我仍然对流程感到困惑。我在my docker文件中寻找以下成就:mvn安装、mvn测试和构建jar文件,我还使用此docker文件将其部署在aws elasticbean Stable上作为我的应用程序后端服务器。我的docker文件应该是什么样子?谢谢