From 0acd9d46a5420b7ee46f364b36eb249400cdd375 Mon Sep 17 00:00:00 2001 From: JustFiesta Date: Tue, 16 Apr 2024 17:24:26 +0200 Subject: [PATCH] Rest docker init files --- .dockerignore | 33 +++++++++++++++ Dockerfile-docker-init | 92 ++++++++++++++++++++++++++++++++++++++++++ README.Docker.md | 19 +++++++++ compose.yaml | 49 ++++++++++++++++++++++ 4 files changed, 193 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile-docker-init create mode 100644 README.Docker.md create mode 100644 compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..698eac10d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,33 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.next +**/.cache +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +**/vendor +LICENSE +README.md diff --git a/Dockerfile-docker-init b/Dockerfile-docker-init new file mode 100644 index 000000000..fe3480fb3 --- /dev/null +++ b/Dockerfile-docker-init @@ -0,0 +1,92 @@ +# syntax=docker/dockerfile:1 + +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Dockerfile-docker-init reference guide at +# https://docs.docker.com/go/dockerfile-reference/ + +# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7 + +################################################################################ + +# Create a stage for resolving and downloading dependencies. +FROM eclipse-temurin:17-jdk-jammy as deps + +WORKDIR /build + +# Copy the mvnw wrapper with executable permissions. +COPY --chmod=0755 mvnw mvnw +COPY .mvn/ .mvn/ + +# Download dependencies as a separate step to take advantage of Docker's caching. +# Leverage a cache mount to /root/.m2 so that subsequent builds don't have to +# re-download packages. +RUN --mount=type=bind,source=pom.xml,target=pom.xml \ + --mount=type=cache,target=/root/.m2 ./mvnw dependency:go-offline -DskipTests + +################################################################################ + +# Create a stage for building the application based on the stage with downloaded dependencies. +# This Dockerfile-docker-init is optimized for Java applications that output an uber jar, which includes +# all the dependencies needed to run your app inside a JVM. If your app doesn't output an uber +# jar and instead relies on an application server like Apache Tomcat, you'll need to update this +# stage with the correct filename of your package and update the base image of the "final" stage +# use the relevant app server, e.g., using tomcat (https://hub.docker.com/_/tomcat/) as a base image. +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 + +################################################################################ + +# Create a stage for extracting the application into separate layers. +# Take advantage of Spring Boot's layer tools and Docker's caching by extracting +# the packaged application into separate layers that can be copied into the final stage. +# See Spring's docs for reference: +# https://docs.spring.io/spring-boot/docs/current/reference/html/container-images.html +FROM package as extract + +WORKDIR /build + +RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted + +################################################################################ + +# Create a new stage for running the application that contains the minimal +# runtime dependencies for the application. This often uses a different base +# image from the install or build stage where the necessary files are copied +# from the install stage. +# +# The example below uses eclipse-turmin's JRE image as the foundation for running the app. +# By specifying the "17-jre-jammy" tag, it will also use whatever happens to be the +# most recent version of that tag when you build your Dockerfile-docker-init. +# If reproducability is important, consider using a specific digest SHA, like +# eclipse-temurin@sha256:99cede493dfd88720b610eb8077c8688d3cca50003d76d1d539b0efc8cca72b4. +FROM eclipse-temurin:17-jre-jammy AS final + +# Create a non-privileged user that the app will run under. +# See https://docs.docker.com/go/dockerfile-user-best-practices/ +ARG UID=10001 +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "${UID}" \ + appuser +USER appuser + +# Copy the executable from the "package" stage. +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", "org.springframework.boot.loader.launch.JarLauncher" ] diff --git a/README.Docker.md b/README.Docker.md new file mode 100644 index 000000000..8716f34bf --- /dev/null +++ b/README.Docker.md @@ -0,0 +1,19 @@ +### Building and running your application + +When you're ready, start your application by running: +`docker compose up --build`. + +Your application will be available at http://localhost:8080. + +### Deploying your application to the cloud + +First, build your image, e.g.: `docker build -t myapp .`. +If your cloud uses a different CPU architecture than your development +machine (e.g., you are on a Mac M1 and your cloud provider is amd64), +you'll want to build the image for that platform, e.g.: +`docker build --platform=linux/amd64 -t myapp .`. + +Then, push it to your registry, e.g. `docker push myregistry.com/myapp`. + +Consult Docker's [getting started](https://docs.docker.com/go/get-started-sharing/) +docs for more detail on building and pushing. \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..8c167de4b --- /dev/null +++ b/compose.yaml @@ -0,0 +1,49 @@ +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Docker Compose reference guide at +# https://docs.docker.com/go/compose-spec-reference/ + +# Here the instructions define your application as a service called "server". +# This service is built from the Dockerfile-docker-init in the current directory. +# You can add other services your application may depend on here, such as a +# database or a cache. For examples, see the Awesome Compose repository: +# https://github.com/docker/awesome-compose +services: + server: + build: + context: . + ports: + - 8080:8080 + +# The commented out section below is an example of how to define a PostgreSQL +# database that your application can use. `depends_on` tells Docker Compose to +# start the database before your application. The `db-data` volume persists the +# database data between container restarts. The `db-password` secret is used +# to set the database password. You must create `db/password.txt` and add +# a password of your choosing to it before running `docker-compose up`. +# depends_on: +# db: +# condition: service_healthy +# db: +# image: postgres +# restart: always +# user: postgres +# secrets: +# - db-password +# volumes: +# - db-data:/var/lib/postgresql/data +# environment: +# - POSTGRES_DB=example +# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password +# expose: +# - 5432 +# healthcheck: +# test: [ "CMD", "pg_isready" ] +# interval: 10s +# timeout: 5s +# retries: 5 +# volumes: +# db-data: +# secrets: +# db-password: +# file: db/password.txt +