diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2d38c6a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM gradle:8.1-jdk17 AS build +WORKDIR /home/gradle/src +ENV GRADLE_USER_HOME /gradle + +COPY build.gradle.kts settings.gradle.kts ./ + +COPY --chown=gradle:gradle . . +RUN gradle build --info && \ + java -Djarmode=layertools -jar build/libs/*.jar extract + +FROM gcr.io/distroless/java17:nonroot +WORKDIR /opt/kafka-streams-template +COPY --from=build /home/gradle/src/dependencies/ ./ +COPY --from=build /home/gradle/src/spring-boot-loader/ ./ +COPY --from=build /home/gradle/src/application/ ./ +COPY HealthCheck.java . + +USER nonroot +ARG GIT_REF="" +ARG GIT_URL="" +ARG BUILD_TIME="" +ARG VERSION=0.0.0 +ENV APP_VERSION=${VERSION} \ + SPRING_PROFILES_ACTIVE="prod" +ENTRYPOINT ["java", "-XX:MaxRAMPercentage=90", "org.springframework.boot.loader.JarLauncher"] + +HEALTHCHECK --interval=25s --timeout=3s --retries=2 CMD ["java", "HealthCheck.java", "||", "exit", "1"] + +LABEL org.opencontainers.image.created=${BUILD_TIME} \ + org.opencontainers.image.authors="Paul-Chrisitan Volkmer, Jakub Lidke" \ + org.opencontainers.image.source=${GIT_URL} \ + org.opencontainers.image.version=${VERSION} \ + org.opencontainers.image.revision=${GIT_REF} \ + org.opencontainers.image.vendor="" \ + org.opencontainers.image.title="etl-processor" \ + org.opencontainers.image.description="Relay application between Onkostar and bwHc for pseudonymization or anonymization of patient data and profide additional monitoring of processed data." diff --git a/HealthCheck.java b/HealthCheck.java new file mode 100644 index 0000000..0aac2a6 --- /dev/null +++ b/HealthCheck.java @@ -0,0 +1,20 @@ +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse.BodyHandlers; + +public class HealthCheck { + + public static void main(String[] args) throws InterruptedException, IOException { + var client = HttpClient.newHttpClient(); + var request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:8001/actuator/health")) + .header("accept", "application/json") + .build(); + var response = client.send(request, BodyHandlers.ofString()); + if (response.statusCode() != 200 || !response.body().contains("UP")) { + throw new RuntimeException("Healthcheck failed"); + } + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index eecd959..290362a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - war id("org.springframework.boot") version "3.1.1" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.9.0" @@ -28,6 +27,10 @@ repositories { mavenCentral() } +tasks.getByName("jar") { + enabled = false +} + dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") @@ -47,7 +50,6 @@ dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-docker-compose") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") - providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("io.projectreactor:reactor-test") }