From 0619b721131a33f6f4bcfc67fe79ee74674cf9ac Mon Sep 17 00:00:00 2001 From: "user.email" Date: Sun, 21 Jul 2024 17:34:12 +0200 Subject: [PATCH] Add dockerfiles, add compose, add build.gradle, modify postgres.properties, add .env --- .env | 6 +++ Dockerfile | 46 +++++++++++++++++++ Dockerfile-multi_stage | 28 +++++++++++ Dockerfile-single_stage | 13 ++++++ build.gradle | 31 +++++++++++++ compose.yaml | 34 ++++++++++++++ docker-compose.yml | 25 ---------- .../resources/application-postgres.properties | 2 + 8 files changed, 160 insertions(+), 25 deletions(-) create mode 100644 .env create mode 100644 Dockerfile create mode 100644 Dockerfile-multi_stage create mode 100644 Dockerfile-single_stage create mode 100644 compose.yaml delete mode 100644 docker-compose.yml diff --git a/.env b/.env new file mode 100644 index 000000000..d398704fa --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +DB_USER=customUser +DB_PASSWORD=customPassword +DB_DATABASE=customDb +DB_CONTAINER_NAME=database +DB_URL=jdbc:postgresql://${DB_CONTAINER_NAME}/${DB_DATABASE} + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..ffee57187 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ + +FROM eclipse-temurin:17-jdk-jammy as deps +WORKDIR /build +COPY --chmod=0755 mvnw mvnw +COPY .mvn/ .mvn/ +RUN --mount=type=bind,source=pom.xml,target=pom.xml \ + --mount=type=cache,target=/root/.m2 ./mvnw dependency:go-offline -DskipTests + +FROM deps as package +WORKDIR /build +COPY ./src src/ +RUN --mount=type=bind,source=pom.xml,target=pom.xml \ + --mount=type=cache,target=/root/.m2 \ + ./mvnw package -DskipTests && \ + mv target/$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout).jar target/app.jar + +FROM package as extract +WORKDIR /build +RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted + +FROM extract as development +WORKDIR /build +RUN cp -r /build/target/extracted/dependencies/. ./ +RUN cp -r /build/target/extracted/spring-boot-loader/. ./ +RUN cp -r /build/target/extracted/snapshot-dependencies/. ./ +RUN cp -r /build/target/extracted/application/. ./ +ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 +CMD [ "java", "-Dspring.profiles.active=postgres", "org.springframework.boot.loader.launch.JarLauncher" ] + +FROM eclipse-temurin:17-jre-jammy AS final +ARG UID=10001 +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "${UID}" \ + appuser +USER appuser +COPY --from=extract build/target/extracted/dependencies/ ./ +COPY --from=extract build/target/extracted/spring-boot-loader/ ./ +COPY --from=extract build/target/extracted/snapshot-dependencies/ ./ +COPY --from=extract build/target/extracted/application/ ./ +EXPOSE 8080 +ENTRYPOINT [ "java", "-Dspring.profiles.active=postgres", "org.springframework.boot.loader.launch.JarLauncher" ] diff --git a/Dockerfile-multi_stage b/Dockerfile-multi_stage new file mode 100644 index 000000000..d728071ce --- /dev/null +++ b/Dockerfile-multi_stage @@ -0,0 +1,28 @@ +FROM eclipse-temurin:17-jdk-jammy as build +WORKDIR /build +COPY --chmod=0755 mvnw mvnw +COPY .mvn/ .mvn/ +COPY pom.xml . +RUN --mount=type=cache,target=/root/.m2 ./mvnw dependency:go-offline -DskipTests + +COPY ./src src/ +RUN --mount=type=cache,target=/root/.m2 \ + ./mvnw package -DskipTests && \ + mv target/$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout).jar target/app.jar + + +FROM eclipse-temurin:17-jre-jammy AS final + +WORKDIR /src + +COPY --from=build /build/target/app.jar . + +RUN groupadd -r -g 2001 groupuser && useradd -r -m -d /home/myuser -u 2001 -g 2001 -s /sbin/nologin myuser + +RUN chown myuser:groupuser . + +USER myuser + +EXPOSE 8080 + +ENTRYPOINT [ "java", "-jar", "/src/app.jar" ] diff --git a/Dockerfile-single_stage b/Dockerfile-single_stage new file mode 100644 index 000000000..73e748563 --- /dev/null +++ b/Dockerfile-single_stage @@ -0,0 +1,13 @@ +FROM maven:3.9-eclipse-temurin-17 + +WORKDIR /src + +COPY ./target/spring-petclinic-4.2.jar /src/app.jar + +RUN groupadd -r -g 2001 groupuser && useradd -r -m -d /home/myuser -g 2001 myuser + +RUN chown myuser:groupuser . + +USER myuser + +ENTRYPOINT [ "java", "-jar", "/src/app.jar" ] diff --git a/build.gradle b/build.gradle index 02c6fd1be..3254119d2 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,15 @@ plugins { id 'io.spring.javaformat' version '0.0.41' id "io.spring.nohttp" version "0.0.11" id 'pl.allegro.tech.build.axion-release' version '1.18.0' + id 'maven-publish' + id 'java-library' } apply plugin: 'java' apply plugin: 'checkstyle' apply plugin: 'io.spring.javaformat' + gradle.startParameter.excludedTaskNames += [ "checkFormatAot", "checkFormatAotTest" ] group = 'org.springframework.samples' @@ -27,6 +30,34 @@ repositories { mavenLocal() } +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + groupId = 'com.example' + artifactId = 'myCustomLib' + version = '1.0.0' + } + } + + repositories { + maven { + name = 'nexus' + url = uri('http://localhost:8081/repository/maven-local/') +allowInsecureProtocol = true + credentials { + username = 'admin' + password = 'admin' + } + } + } +} + +task localpublish { + dependsOn publish + description "publish to a local nexus repository instance" +} + ext.webjarsFontawesomeVersion = "4.7.0" ext.webjarsBootstrapVersion = "5.3.3" diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..9dba59482 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,34 @@ +services: + database: + image: postgres + environment: + - POSTGRES_USER=${DB_USER:-petclinic} + - POSTGRES_DB=${DB_DATABASE:-petclinic} + - POSTGRES_PASSWORD=${DB_PASSWORD:-petclinic} + healthcheck: + test: ["CMD-SHELL", "pg_isready", "-d", "${DB_DATABASE:-petclinic}"] + interval: 10s + retries: 5 + volumes: + - postgres_data:/var/lib/postgresql + + app: + build: + context: . + dockerfile: Dockerfile-multi_stage + environment: + - POSTGRES_URL=${DB_URL:-petclinic} + - POSTGRES_USER=${DB_USER:-petclinic} + - POSTGRES_PASS=${DB_PASSWORD:-petclinic} + - DATABASE=postgres + - SPRING_PROFILES_ACTIVE=postgres + depends_on: + database: + condition: service_healthy + volumes: + - deps:/home/myuser/.m2 + ports: + - "8080:8080" +volumes: + postgres_data: + deps: diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index aaebf7ca8..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,25 +0,0 @@ -services: - mysql: - image: mysql:8.4 - ports: - - "3306:3306" - environment: - - MYSQL_ROOT_PASSWORD= - - MYSQL_ALLOW_EMPTY_PASSWORD=true - - MYSQL_USER=petclinic - - MYSQL_PASSWORD=petclinic - - MYSQL_DATABASE=petclinic - volumes: - - "./conf.d:/etc/mysql/conf.d:ro" - profiles: - - mysql - postgres: - image: postgres:16.3 - ports: - - "5432:5432" - environment: - - POSTGRES_PASSWORD=petclinic - - POSTGRES_USER=petclinic - - POSTGRES_DB=petclinic - profiles: - - postgres diff --git a/src/main/resources/application-postgres.properties b/src/main/resources/application-postgres.properties index 60889b43c..1a0ba4921 100644 --- a/src/main/resources/application-postgres.properties +++ b/src/main/resources/application-postgres.properties @@ -4,3 +4,5 @@ spring.datasource.username=${POSTGRES_USER:petclinic} spring.datasource.password=${POSTGRES_PASS:petclinic} # SQL is written to be idempotent so this is safe spring.sql.init.mode=always +logging.level=DEBUG +logging.level.org.springframework.web=DEBUG