تخطَّ إلى المحتوى
QuenchWorks

بناء تطبيق Java

لا تحتاج خدمة Java إلى JDK كامل لتعمل، بل إلى JRE فقط. فابنِ ملف jar بسلسلة الأدوات في مرحلة، ثم شغّله على أساس jre النحيل في المرحلة التالية. يبقى المُجمِّع وأداة البناء وذاكرة الاعتماديات في مرحلة البناء، وتحمل الصورة النهائية بيئة التشغيل وملف jar الخاص بك.

يبني هذا على ghcr.io/quenchworks/images/maven:3.9 أو ghcr.io/quenchworks/images/gradle:9، ثم يشغّل على ghcr.io/quenchworks/images/jre:21. طابِق خط JRE مع إصدار Java الذي جمّعت من أجله.

ملف Dockerfile المتعدد المراحل

# Build stage: resolve dependencies, then package the jar.
FROM ghcr.io/quenchworks/images/maven:3.9 AS build
WORKDIR /app
# Resolve dependencies first so the layer caches when only code changes.
COPY pom.xml ./
RUN ["mvn", "-B", "dependency:go-offline"]
COPY src ./src
RUN ["mvn", "-B", "-o", "package", "-DskipTests"]
# Runtime stage: run the jar on the slim JRE base, nonroot.
FROM ghcr.io/quenchworks/images/jre:21 AS runtime
WORKDIR /app
COPY --from=build /app/target/*.jar /app/app.jar
USER 1001
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
# Build stage: build the jar with Gradle.
FROM ghcr.io/quenchworks/images/gradle:9 AS build
WORKDIR /app
# Cache dependencies before copying the full source.
COPY build.gradle.kts settings.gradle.kts ./
RUN ["gradle", "dependencies", "--no-daemon"]
COPY src ./src
RUN ["gradle", "bootJar", "--no-daemon", "-x", "test"]
FROM ghcr.io/quenchworks/images/jre:21 AS runtime
WORKDIR /app
COPY --from=build /app/build/libs/*.jar /app/app.jar
USER 1001
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

ماذا تفعل كل مرحلة

  1. البناء. تحمل صورة maven أو gradle الـ JDK وأداة البناء. حُلّ الاعتماديات قبل نسخ المصدر كي تُخزَّن تلك الطبقة عبر عمليات البناء، ثم احزم ملف jar. تبقى ذاكرة الاعتماديات والمُجمِّع في هذه المرحلة.
  2. التشغيل. ابدأ من jre:21، وانسخ ملف jar الواحد، وانزل إلى uid 1001، وشغّله. لا JDK، ولا أداة بناء، ولا مصدر.

التالي

  • بناء ملف jar مكتفٍ ذاتيًا (Spring Boot، أو Quarkus، أو jar مظلّل) يُبقي مرحلة التشغيل عند COPY واحد؛ وتخطيطات jar المتعددة تعمل أيضًا، فقط انسخ طبقتي الاعتماديات والتطبيق.
  • ثبّت بالبصمة الرقمية ليجري كل بناء بالضبط على الأساس الذي جرى فحصه وتوقيعه.