|
| 1 | +# Base image for compiling |
| 2 | +FROM maven:3.8-openjdk-17 as compiler |
| 3 | + |
| 4 | +WORKDIR /tmp/build |
| 5 | + |
| 6 | +# Install required tools |
| 7 | +RUN microdnf install zip |
| 8 | + |
| 9 | +# Define a build argument for project name (default: ocportal) |
| 10 | +ARG PROJECT_NAME=ocportal |
| 11 | + |
| 12 | +# Copy pom.xml files |
| 13 | +COPY forms/pom.xml forms/pom.xml |
| 14 | +COPY persistence/pom.xml persistence/pom.xml |
| 15 | +COPY persistence-mongodb/pom.xml persistence-mongodb/pom.xml |
| 16 | +COPY web/pom.xml web/pom.xml |
| 17 | +COPY pom.xml . |
| 18 | + |
| 19 | +# Set Maven options |
| 20 | +ENV MAVEN_OPTS="-XX:-TieredCompilation -XX:TieredStopAtLevel=1" |
| 21 | + |
| 22 | +# Use a cache-friendly Maven dependency resolution |
| 23 | +RUN --mount=type=cache,target=/root/.m2,id=${PROJECT_NAME}-m2 \ |
| 24 | + find . -name pom.xml | xargs -I@ mvn -B -f @ dependency:go-offline dependency:resolve-plugins || true |
| 25 | + |
| 26 | +# Copy all source code |
| 27 | +COPY . . |
| 28 | +#we compile the code then we explode the fat jar. This is useful to create a reusable layer and save image space/compile time |
| 29 | +RUN --mount=type=cache,target=/root/.m2,id=${PROJECT_NAME}-m2 \ |
| 30 | + mvn -T 1C clean package -DskipTests -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dmaven.gitcommitid.skip=true |
| 31 | + |
| 32 | +# Extract compiled JAR to save space and improve caching |
| 33 | +RUN mkdir -p forms/target/deps \ |
| 34 | + && cd forms/target/deps \ |
| 35 | + && unzip -qo '../*.jar' || ( e=$? && if [ $e -ne 1 ]; then exit $e; fi ) \ |
| 36 | + && rm -f ../*.* |
| 37 | + |
| 38 | +# Production image |
| 39 | +FROM openjdk:17-jdk-slim as prod |
| 40 | + |
| 41 | +WORKDIR /opt/app |
| 42 | + |
| 43 | +# Install required dependencies |
| 44 | +RUN apt-get update && apt-get install -y fontconfig libfreetype6 && rm -rf /var/lib/apt/lists/* |
| 45 | +#we copy artifacts from exploded jar, one by one, each COPY command will create a separate docker layer |
| 46 | +#this means that for example if lib folder gets unchanged in between builds (no jars were updated) the same layer is reused |
| 47 | +COPY --from=compiler /tmp/build/forms/target/deps/BOOT-INF/lib lib |
| 48 | +COPY --from=compiler /tmp/build/forms/target/deps/META-INF META-INF |
| 49 | +COPY --from=compiler /tmp/build/forms/target/deps/BOOT-INF/classes . |
| 50 | + |
| 51 | +# Copy entrypoint script |
| 52 | +COPY --chmod=0755 entrypoint.sh . |
| 53 | + |
| 54 | +# Expose application port |
| 55 | +EXPOSE 8090 |
| 56 | + |
| 57 | +# Wait for dependencies before starting app |
| 58 | +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.12.0/wait /wait |
| 59 | +RUN chmod +x /wait |
| 60 | + |
| 61 | +# Start application |
| 62 | +CMD /wait && /opt/app/entrypoint.sh admin |
| 63 | + |
| 64 | +# Development image |
| 65 | +FROM openjdk:17-jdk-slim as dev |
| 66 | + |
| 67 | +WORKDIR /opt/app |
| 68 | + |
| 69 | +# Install required dependencies |
| 70 | +RUN apt-get update && apt-get install -y fontconfig libfreetype6 && rm -rf /var/lib/apt/lists/* |
| 71 | + |
| 72 | +# Copy compiled dependencies |
| 73 | +COPY --from=compiler /tmp/build/forms/target/deps/BOOT-INF/lib lib |
| 74 | + |
| 75 | +# Remove development-specific JARs to avoid conflicts |
| 76 | +RUN rm -f lib/persistence*-SNAPSHOT.jar |
| 77 | +RUN rm -f lib/web*-SNAPSHOT.jar |
| 78 | + |
| 79 | +# Copy entrypoint script |
| 80 | +COPY --chmod=0755 entrypoint.sh . |
| 81 | + |
| 82 | +# Expose application and debug ports |
| 83 | +EXPOSE 8090 |
| 84 | +EXPOSE 8000 |
| 85 | + |
| 86 | +# Enable remote debugging |
| 87 | +ENV JAVA_TOOL_OPTIONS "-agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n" |
| 88 | + |
| 89 | +# Wait for database readiness before starting the app |
| 90 | +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.12.0/wait /wait |
| 91 | +RUN chmod +x /wait |
| 92 | + |
| 93 | +# Start application in development mode |
| 94 | +CMD /wait && /opt/app/entrypoint.sh admin-dev |
0 commit comments