java - 如何使用 Docker 文件通过 Junit 测试运行 Spring Boot 应用程序

标签 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

或者我还应该使用哪些其他命令?

最佳答案

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,并且还需要在容器上安装 ma​​ven

  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) 使用 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/

相关文章:

java - 如何访问和读取JVM类文件成员?

java - 字符串的替代表示

docker - 如果一群人完全停止了,docker服务配置或 secret 会怎样?

docker - 我正在使用 Azure Devops 来构建和推送我的 Docker 镜像。使用 Docker 任务执行 buildAndPush 时如何传递参数?

java - 从 Docker 进程内部在主机上运行 Runtime.getRuntime().exec

java - 包装在不可变对象(immutable对象)内的可变对象安全吗?

java - 尽管回收了所有位图并收集垃圾,但在 Activity 之间来回时出现 OutOfMemoryException

angularjs - 无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?

java - 如何在 Spring Boot 中将特定类记录到另一个日志文件

java - Spring-boot 测试中的 EntityManagerFactory Bean