现在我的 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
或者我还应该使用哪些其他命令?
最佳答案
Premise: Even if the solution is oriented to your specifics it would be better to execute tests during target jar build phase
要对 Dockerfile 执行测试,您可以执行以下操作之一:
还复制 Dockerfile 上的源文件并执行 Maven 测试命令。这样做,您还可以直接在容器上构建目标 jar,并且还需要在容器上安装 maven。
仅复制目标 jar 文件并使用它来执行您需要在目标 jar 上包含测试类的测试。 (参见How can I include test classes into Maven jar and execute them?)。
无论您选择哪种方式,您都可以修改入口点以执行多个命令。您基本上可以通过两种方式做到这一点:
- (a) 创建执行命令的 bash 脚本(参见 Multiple commands on docker ENTRYPOINT )
- (b) 使用 supervisord(参见 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) )来执行此操作。 创建如下 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"]
关于java - 如何使用 Docker 文件通过 Junit 测试运行 Spring Boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60843676/