بناء تطبيق 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 buildWORKDIR /app
# Resolve dependencies first so the layer caches when only code changes.COPY pom.xml ./RUN ["mvn", "-B", "dependency:go-offline"]COPY src ./srcRUN ["mvn", "-B", "-o", "package", "-DskipTests"]
# Runtime stage: run the jar on the slim JRE base, nonroot.FROM ghcr.io/quenchworks/images/jre:21 AS runtimeWORKDIR /appCOPY --from=build /app/target/*.jar /app/app.jarUSER 1001EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app/app.jar"]# Build stage: build the jar with Gradle.FROM ghcr.io/quenchworks/images/gradle:9 AS buildWORKDIR /app
# Cache dependencies before copying the full source.COPY build.gradle.kts settings.gradle.kts ./RUN ["gradle", "dependencies", "--no-daemon"]COPY src ./srcRUN ["gradle", "bootJar", "--no-daemon", "-x", "test"]
FROM ghcr.io/quenchworks/images/jre:21 AS runtimeWORKDIR /appCOPY --from=build /app/build/libs/*.jar /app/app.jarUSER 1001EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app/app.jar"]ماذا تفعل كل مرحلة
- البناء. تحمل صورة
mavenأوgradleالـ JDK وأداة البناء. حُلّ الاعتماديات قبل نسخ المصدر كي تُخزَّن تلك الطبقة عبر عمليات البناء، ثم احزم ملف jar. تبقى ذاكرة الاعتماديات والمُجمِّع في هذه المرحلة. - التشغيل. ابدأ من
jre:21، وانسخ ملف jar الواحد، وانزل إلىuid 1001، وشغّله. لا JDK، ولا أداة بناء، ولا مصدر.
التالي
- بناء ملف jar مكتفٍ ذاتيًا (Spring Boot، أو Quarkus، أو jar مظلّل) يُبقي مرحلة التشغيل عند
COPYواحد؛ وتخطيطات jar المتعددة تعمل أيضًا، فقط انسخ طبقتي الاعتماديات والتطبيق. - ثبّت بالبصمة الرقمية ليجري كل بناء بالضبط على الأساس الذي جرى فحصه وتوقيعه.