diff --git a/Dockerfile b/Dockerfile index 4ef45f7a..65e51594 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,30 @@ + +# Stage 0: Build image +FROM maven:3.8.3-jdk-8 + +ARG BACKEND_ROOT="WIPP-backend" +ARG BACKEND_APP="wipp-backend-application" +ARG BACKEND_DATA="wipp-backend-data" +ARG BACKEND_CORE="wipp-backend-core" +ARG BACKEND_ARGO="wipp-backend-argo-workflows" + +COPY pom.xml /usr/local/${BACKEND_ROOT}/pom.xml +COPY ${BACKEND_NAME} /usr/local/${BACKEND_ROOT}/${BACKEND_NAME} +COPY ${BACKEND_DATA} /usr/local/${BACKEND_ROOT}/${BACKEND_DATA} +COPY ${BACKEND_CORE} /usr/local/${BACKEND_ROOT}/${BACKEND_CORE} +COPY ${BACKEND_ARGO} /usr/local/${BACKEND_ROOT}/${BACKEND_ARGO} +COPY deploy/docker/maven-settings.xml /usr/share/maven/conf/settings.xml +WORKDIR /usr/local/${BACKEND_ROOT} +RUN mvn clean package -P prod + +# Stage 1: Runtime image FROM openjdk:8-jdk-alpine -MAINTAINER National Institute of Standards and Technology +LABEL org.opencontainers.image.authors="National Institute of Standards and Technology" EXPOSE 8080 -ARG BACKEND_NAME="wipp-backend-application" +ARG BACKEND_ROOT="WIPP-backend" +ARG BACKEND_APP="wipp-backend-application" ARG EXEC_DIR="/opt/wipp" ARG DATA_DIR="/data/WIPP-plugins" ARG ARGO_VERSION="v2.3.0" @@ -24,8 +45,8 @@ RUN wget https://github.com/argoproj/argo-workflows/releases/download/${ARGO_VER chmod +x argo-linux-amd64 && \ mv argo-linux-amd64 /usr/local/bin/argo -# Copy WIPP backend application exec WAR -COPY ${BACKEND_NAME}/target/${BACKEND_NAME}-*-exec.war ${EXEC_DIR}/wipp-backend.war +# Copy WIPP backend application exec WAR from the previous stage +COPY --from=0 /usr/local/${BACKEND_ROOT}/${BACKEND_APP}/target/${BACKEND_APP}-*-exec.war ${EXEC_DIR}/wipp-backend.war # Copy properties and entrypoint script COPY deploy/docker/application.properties ${EXEC_DIR}/config diff --git a/Dockerfile.localdev b/Dockerfile.localdev new file mode 100644 index 00000000..94a89533 --- /dev/null +++ b/Dockerfile.localdev @@ -0,0 +1,38 @@ +FROM openjdk:8-jdk-alpine +LABEL org.opencontainers.image.authors="National Institute of Standards and Technology" + +EXPOSE 8080 + +ARG BACKEND_NAME="wipp-backend-application" +ARG EXEC_DIR="/opt/wipp" +ARG DATA_DIR="/data/WIPP-plugins" +ARG ARGO_VERSION="v2.3.0" +ARG APM_VERSION="1.9.0" + +COPY deploy/docker/VERSION /VERSION + +# Create exec and data folders +RUN mkdir -p \ + ${EXEC_DIR}/config \ + ${DATA_DIR} + +# Download Elastic APM Java Agent +RUN wget https://repo1.maven.org/maven2/co/elastic/apm/elastic-apm-agent/${APM_VERSION}/elastic-apm-agent-${APM_VERSION}.jar -O ${EXEC_DIR}/elastic-apm-agent.jar + +# Install Argo CLI executable +RUN wget https://github.com/argoproj/argo-workflows/releases/download/${ARGO_VERSION}/argo-linux-amd64 && \ + chmod +x argo-linux-amd64 && \ + mv argo-linux-amd64 /usr/local/bin/argo + +# Copy WIPP backend application exec WAR +COPY ${BACKEND_NAME}/target/${BACKEND_NAME}-*-exec.war ${EXEC_DIR}/wipp-backend.war + +# Copy properties and entrypoint script +COPY deploy/docker/application.properties ${EXEC_DIR}/config +COPY deploy/docker/entrypoint.sh /usr/local/bin + +# Set working directory +WORKDIR ${EXEC_DIR} + +# Entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/README.md b/README.md index 27df709c..87921076 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,22 @@ mvn spring-boot:run - http://localhost:8080/v2/api-docs (OpenAPI spec) ## Docker packaging +There are two ways to build Docker images for WIPP-backend: + +- For local development, first compile the project (so it produces `wipp-backend-application/target/wipp-backend-application-...-exec.war`), then build Docker image from `Dockerfile.localdev`. + The Maven `prod` profile should be used for Docker packaging, even for testing/development purposes: ```sh mvn clean package -P prod +docker build --no-cache -f Dockerfile.localdev . -t wipp_backend +``` + +- For CI builds or if you don't have Java/Maven installed on host, simply build Docker image from `Dockerfile` +```sh docker build --no-cache . -t wipp_backend ``` + + For a Docker deployment of WIPP on a Kubernetes cluster, scripts and configuration files are available in the [WIPP repository](https://github.com/usnistgov/WIPP/tree/master/deployment). ## Deployment diff --git a/deploy/docker/maven-settings.xml b/deploy/docker/maven-settings.xml new file mode 100644 index 00000000..f17de610 --- /dev/null +++ b/deploy/docker/maven-settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file