"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء صورة Docker لتطبيق Spring Boot باستخدام Buildpacks

إنشاء صورة Docker لتطبيق Spring Boot باستخدام Buildpacks

تم النشر بتاريخ 2024-11-05
تصفح:379

Creating Docker Image of Spring Boot Application using Buildpacks

مقدمة

لقد قمت بإنشاء تطبيق Spring Boot. إنه يعمل بشكل رائع على جهازك المحلي، والآن تحتاج إلى نشر التطبيق في مكان آخر. في بعض الأنظمة الأساسية، يمكنك إرسال ملف jar مباشرة وسيتم نشره. في بعض الأماكن، يمكنك تشغيل جهاز افتراضي، وتنزيل الكود المصدري هناك، وإنشائه، وتشغيله. ولكن، في أغلب الأحيان، ستحتاج إلى نشر التطبيق باستخدام الحاويات. في معظم الأحيان، يتم استخدام Docker لإنشاء الصورة وتشغيلها في حاوية. أيضًا، عند تحميل ملف الجرة إلى بعض الأنظمة الأساسية، يتم تشغيل التطبيق داخل حاوية أسفل الغطاء.

لذلك، في هذه المدونة، سنرى 3 طرق مختلفة لإنشاء صورة Docker لتطبيق Spring Boot المحدد. لنبدأ:

صورة الحاوية الأساسية

الطريقة الساذجة وغير الكافية لإنشاء صورة Docker لأي تطبيق هي استخدام ملف Dockerfile البسيط الذي يقوم بنسخ ملف jar داخل الصورة وتشغيله باستخدام أمر java -jar.

إنشاء ملف دوكر

إليك ملف Dockerfile الذي يمكنك وضعه في جذر المشروع:

FROM eclipse-temurin:21-jre-ubi9-minimal

ARG JAR_FILE

COPY ${JAR_FILE} application.jar

ENTRYPOINT ["java", "-jar", "/application.jar"]

لقد حددنا وسيطة واحدة JAR_FILE وهي موقع ملف الجرة المطلوب استخدامه.

بناء صورة عامل الميناء

بعد إنشاء ملف Dockerfile أعلاه، يتم استخدام الخطوات التالية لإنشاء صورة Docker:

  1. قم بإنشاء ملف jar لمشروع Spring Boot:

    ./gradlew bootJar # For Gradle build system
    

    أو

    ./mvnw spring-boot:build-jar # For Maven build system
    
  2. استخدم ملف Dockerfile لإنشاء صورة Docker باستخدام أحدث ملف jar. في الأمر أدناه، استبدل {IMAGE_NAME} باسم الصورة المطلوبة و{JAR_FILE} بالمسار إلى ملف الجرة الذي تم إنشاؤه. يحتوي اسم الصورة على علامة أيضًا، مثل - mycompany/product-service:0.0.1-SNAPSHOT:

    docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
    
  3. تحقق من إنشاء صورة Docker باستخدام الأمر التالي. يجب أن تكون قادرًا على رؤية الصورة بالاسم المحدد في الأمر أعلاه:

    docker images
    

صورة حاوية فعالة باستخدام جرة الطبقات

على الرغم من أنه من الممكن والسهل تعبئة جرة Spring Boot uber كصورة Docker (كما هو مذكور في الطريقة السابقة)، إلا أن هناك العديد من الجوانب السلبية لنسخ وتشغيل جرة الدهون كما هي في صورة Docker. على سبيل المثال،

  • هناك بعض الحمل الإضافي عند تشغيل uber jar دون تفريغه.
  • إن وضع كود التطبيق وجميع تبعياته في طبقة واحدة ليس هو الأمثل.

نظرًا لأننا نقوم بتجميع التعليمات البرمجية الخاصة بنا في كثير من الأحيان بدلاً من ترقية إصدار Spring Boot، فمن الأفضل فصل الأشياء أكثر قليلاً. إذا وضعنا ملفات jar هذه (التي نادرًا ما يتم تغييرها) في الطبقة قبل طبقة التطبيق، فغالبًا ما يحتاج Docker إلى تغيير الطبقة السفلية فقط ويمكنه اختيار الباقي من ذاكرة التخزين المؤقت الخاصة به.

تمكين جرة الطبقات

لإنشاء صورة Docker ذات طبقات، نحتاج إلى إنشاء جرة ذات طبقات أولاً. في الوقت الحاضر، يتم تمكينه افتراضيًا في Gradle وMaven. يمكنك تمكين أو تعطيل سلوك الجرة ذات الطبقات باستخدام الإعداد التالي:

// build.gradle
tasks.named("bootJar") {
    layered {
        enabled = false
    }
}
// build.gradle.kts
tasks.named("bootJar") {
   layered {
      enabled.set(false)
   }
}

org.springframework.bootspring-boot-maven-plugintrue

يمكنك أيضًا ضبط كيفية إنشاء الطبقات. راجع الوثائق الخاصة بتكوين Gradle أو Maven.

إنشاء ملف دوكر

يوجد أدناه ملف Dockerfile، والذي يمكن استخدامه للاستفادة من الجرة ذات الطبقات وإنشاء صورة Docker ذات طبقات لتطبيق Spring Boot.

# Perform the extraction in a separate builder container
FROM eclipse-temurin:21-jre-ubi9-minimal AS builder

WORKDIR /builder

# This points to the built jar file in the target folder
# Adjust this to 'build/libs/*.jar' if you're using Gradle
ARG JAR_FILE=target/*.jar

# Copy the jar file to the working directory and rename it to application.jar
COPY ${JAR_FILE} application.jar

# Extract the jar file using an efficient layout
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted

# This is the runtime container
FROM eclipse-temurin:21-jre-ubi9-minimal

WORKDIR /application

# Copy the extracted jar contents from the builder container into the working directory in the runtime container
# Every copy step creates a new docker layer
# This allows docker to only pull the changes it really needs
COPY --from=builder /builder/extracted/dependencies/ ./
COPY --from=builder /builder/extracted/spring-boot-loader/ ./
COPY --from=builder /builder/extracted/snapshot-dependencies/ ./
COPY --from=builder /builder/extracted/application/ ./

# Start the application jar - this is not the uber jar used by the builder
# This jar only contains application code and references to the extracted jar files
# This layout is efficient to start up and CDS friendly
ENTRYPOINT ["java", "-jar", "application.jar"]

بناء صورة عامل الميناء

خطوات إنشاء صورة Docker ذات الطبقات هي نفس خطوات إنشاء صورة Docker الأساسية. يرجى الرجوع هناك.

حزم البناء السحابية الأصلية

ماذا لو أخبرتك أنه يمكنك إنشاء صورة Docker دون إنشاء ملف Dockerfile؟ يمكننا إنشاء صور عامل الإرساء مباشرة من المكون الإضافي Gralde أو Maven باستخدام Cloud Native Buildpacks. تستخدم بعض الأنظمة الأساسية (مثل Heroku أو Cloud Foundry) حزم Buildpacks لتحويل ملفات jar المتوفرة إلى صور قابلة للتشغيل.

يتضمن Spring Boot دعمًا مباشرًا لـ Maven وGradle. لا نحتاج إلى تضمين أي مكونات إضافية. فقط قم بتشغيل الأمر أدناه:

./gradlew bootBuildImage # For gradle build system

أو

./mvnw spring-boot:build-image # For maven build system

يقوم الأمر أعلاه بإنشاء صورة بالاسم الافتراضي {PROJECT_NAME}:${PROJECT_VERSION}. إذا كنت تريد تكوين اسم الصورة التي تم إنشاؤها، يمكنك اتباع الخطوات التالية:

تكوين اسم الصورة لنظام بناء Gradle

يمكننا تكوين مهمة bootBuildImage لتعيين اسم الصورة، مثل هذا:

// For build.gradle.kts
val imagePrefix = "javarush"
val dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName.set("${imagePrefix}/${dockerImageName}:${version}")
}
// For build.gradle
def imagePrefix = "javarush"
def dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName = "${imagePrefix}/${dockerImageName}:${version}"
}

تكوين اسم الصورة لنظام بناء Maven

يمكننا تكوين Spring-boot-maven-plugin لاستخدام اسم صورة آخر، مثل هذا:

javarush

...

org.springframework.bootspring-boot-maven-plugin${imagePrefix}/${project.artifactId}:${project.version}

تكوين اسم الصورة أثناء تشغيل الأمر

يمكننا أيضًا تحديد اسم الصورة أثناء تشغيل أمر إنشاء الصورة.

./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system

يمكنك الاطلاع على الوثائق لتكوين البرنامج الإضافي Gradle أو Maven بشكل أكبر.
هذه هي طريقتي المفضلة لإنشاء صورة Docker لأي تطبيق Spring Boot.

تشغيل حاوية دوكر

بمجرد إنشاء صورة عامل إرساء، عليك التأكد من أنها تعمل كما هو متوقع. بعد التأكد من إنشاء الصورة، يمكنك تشغيلها مباشرةً باستخدام أمر docker run. على سبيل المثال،

docker run -p "8080:8080" {IMAGE_NAME}

ولكن هذه ليست الطريقة التي يتم بها استخدام الصور في تطبيقات الإنتاج. يُستخدم Docker Compose لتشغيل وإدارة صور عامل الإرساء المتعددة.

خاتمة

لقد رأينا في هذه المدونة كيفية إنشاء صور Docker لتطبيقات Spring Boot باستخدام طرق مختلفة. تعد القدرة على إنشاء صور عامل إرساء لتطبيقاتك مهارة يجب معرفتها لأن الصورة هي ما يتم تسليمه. شكرا لقراءة المقال حتى النهاية. أنا أقدر ذلك. سألتقي بك في المرة القادمة. كما هو الحال دائمًا، نرحب بجميع التعليقات والاقتراحات.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/himanshu-pareek/creating-docker-image-of-spring-boot-application-using-buildpacks-5dbo?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang@163 .com لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3