د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

کانټینرونه د دې ټولو سافټویر او عملیاتي سیسټم انحصارونو سره د غوښتنلیک بسته کولو غوره وسیله ګرځیدلې او بیا یې مختلف چاپیریال ته وړاندې کوي.

دا مقاله د پسرلي بوټ غوښتنلیک کانټینر کولو بیلابیل لارې پوښي:

  • د ډاکر فایل په کارولو سره د ډاکر عکس رامینځته کول ،
  • د Cloud-Native Buildpack په کارولو سره د سرچینې څخه د OCI انځور جوړول،
  • او د څو اړخیزو وسیلو په کارولو سره د JAR برخې په بیلابیلو پرتونو جلا کولو سره د چلولو وخت عکس اصلاح کول.

 د کوډ مثال

دا مقاله د کاري کوډ مثال سره ده په GitHub کې .

د کانټینر اصطلاح

موږ به د کانټینر اصطلاحاتو سره پیل وکړو چې په مقاله کې کارول شوي:

  • د کانټینر انځور: د یوې ځانګړې بڼې فایل. موږ به خپل غوښتنلیک د جوړونې وسیلې په چلولو سره د کانټینر عکس ته واړوو.
  • کانټینر: د کانټینر عکس د اجرا وړ مثال.
  • د کانټینر انجن: د ډیمون پروسه د کانټینر چلولو مسؤلیت لري.
  • د کانټینر کوربه: کوربه کمپیوټر چې د کانټینر انجن چلوي.
  • د کانټینر ثبت: عمومي ځای چې د کانټینر عکس خپرولو او توزیع کولو لپاره کارول کیږي.
  • د OCI معیارخلاص کانټینر نوښت (OCI) د لینوکس فاونډیشن دننه جوړ شوی یو لږ وزن لرونکی ، خلاصې حکومتدارۍ جوړښت دی. د OCI عکس مشخصات د کانټینر عکس او رن ټایم فارمیټونو لپاره د صنعت معیارونه ټاکي ترڅو ډاډ ترلاسه کړي چې ټول کانټینر انجنونه کولی شي د کانټینر عکسونه پرمخ بوځي چې د هرې جوړونې وسیلې لخوا رامینځته شوي.

د یو غوښتنلیک کانټینر کولو لپاره، موږ خپل غوښتنلیک په یو کانټینر عکس کې وتړو او هغه انځور شریک شوي ثبت ته خپور کړو. د کانټینر چلولو وخت دا عکس له راجسټري څخه ترلاسه کوي ، خلاصوي یې ، او غوښتنلیک دننه یې چلوي.

د پسرلي بوټ 2.3 نسخه د OCI عکسونو رامینځته کولو لپاره پلگ ان چمتو کوي.

ډاکر ترټولو عام کارول شوي کانټینر پلي کول دي ، او موږ په خپلو مثالونو کې ډاکر کاروو ، نو پدې مقاله کې ټول راتلونکي کانټینر حوالې به ډاکر ته راجع شي.

د کانټینر عکس جوړول په دودیز ډول

د پسرلي بوټ غوښتنلیکونو لپاره د ډاکر عکسونو رامینځته کول د ډاکر فایل ته د څو لارښوونو اضافه کولو سره خورا اسانه دي.

موږ لومړی د اجرا وړ JAR فایل رامینځته کوو او د ډاکر فایل لارښوونو برخې په توګه ، د لازمي تنظیماتو پلي کولو وروسته د اساس JRE عکس په سر کې د اجرا وړ JAR فایل کاپي کوو.

راځئ چې زموږ د پسرلي غوښتنلیک جوړ کړو د پسرلي پیل له انحصار سره weblombokи actuator. موږ د API چمتو کولو لپاره د آرام کنټرولر هم اضافه کوو GETطریقه

د ډاکر فایل رامینځته کول

بیا موږ دا غوښتنلیک په اضافه کولو سره کانټینر کوو Dockerfile:

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/application.jar"]

زموږ د ډاکر فایل د اساس عکس لري adoptopenjdk، چې په سر کې موږ زموږ د JAR فایل کاپي کوو او بیا بندر خلاصوو ، 8080کوم چې غوښتنو ته غوږ نیسي.

د غوښتنلیک جوړول

لومړی تاسو اړتیا لرئ د Maven یا Gradle په کارولو سره یو غوښتنلیک جوړ کړئ. دلته موږ Maven کاروو:

mvn clean package

دا د غوښتنلیک لپاره د اجرا وړ JAR فایل رامینځته کوي. موږ اړتیا لرو چې دا اجرا وړ JAR د ډاکر عکس ته واړوو ترڅو د ډاکر انجن چلولو لپاره.

د کانټینر عکس جوړول

بیا موږ دا د اجرا وړ JAR فایل د کمانډ په چلولو سره د ډاکر عکس کې واچوو docker buildد پروژې روټ لارښود څخه چې مخکې جوړ شوی ډاکر فایل لري:

docker build  -t usersignup:v1 .

موږ کولی شو خپل عکس په لیست کې د کمانډ په کارولو سره وګورو:

docker images 

د پورتنۍ کمانډ په محصول کې زموږ عکس شامل دی usersignupد بنسټیز انځور سره، adoptopenjdkزموږ د ډاکر فایل کې مشخص شوی.

REPOSITORY          TAG                 SIZE
usersignup          v1                  249MB
adoptopenjdk        11-jre-hotspot      229MB

د کانټینر عکس دننه پرتونه وګورئ

راځئ چې د عکس دننه د پرتونو سټیک وګورو. موږ به وکاروو وسیله  ډوب د دې پرتونو لیدلو لپاره:

dive usersignup:v1

دلته د Dive کمانډ څخه د محصول برخه ده: 

د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

لکه څنګه چې موږ لیدلی شو، د غوښتنلیک پرت د عکس اندازې یوه مهمه برخه جوړوي. موږ غواړو زموږ د اصلاح کولو برخې په توګه په لاندې برخو کې د دې پرت اندازه کمه کړو.

د Buildpack په کارولو سره د کانټینر عکس رامینځته کول

د مجلس کڅوړې (جوړونه) یو عمومي اصطلاح ده چې د مختلف پلیټ فارم لخوا د خدماتو (PAAS) وړاندیزونو په توګه کارول کیږي ترڅو د سرچینې کوډ څخه د کانټینر عکس رامینځته کړي. دا په 2011 کې د هیروکو لخوا په لاره اچول شوی و او له هغه وروسته د کلاوډ فاونډري، د ګوګل اپ انجن، ګیټلاب، Knative او یو شمیر نورو لخوا منل شوی.

د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

د بادل جوړولو کڅوړو ګټه

د عکسونو رامینځته کولو لپاره د Buildpack کارولو یوه له اصلي ګټو څخه دا ده د عکس ترتیب کولو بدلونونه په مرکزي ډول اداره کیدی شي (بلډر) او د بلډر په کارولو سره ټولو غوښتنلیکونو ته تبلیغ کیدی شي.

د جوړونې کڅوړې په کلکه پلیټ فارم سره یوځای شوي. Cloud-Native Buildpacks د OCI عکس فارمیټ ملاتړ کولو سره په پلیټ فارمونو کې معیاري کول چمتو کوي ، کوم چې ډاډ ورکوي چې عکس د ډاکر انجن لخوا پرمخ وړل کیدی شي.

د پسرلي بوټ پلگ ان کارول

د پسرلي بوټ پلگ ان د Buildpack په کارولو سره د سرچینې څخه د OCI عکسونه جوړوي. انځورونه په کارولو سره جوړ شوي دي bootBuildImageدندې (Gradle) یا spring-boot:build-imageهدفونه (Maven) او د ځایی ډاکر نصب کول.

موږ کولی شو د نوم په ټاکلو سره د ډاکر راجسټری ته د فشار لپاره اړین عکس نوم تنظیم کړو image tag:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <image>
      <name>docker.io/pratikdas/${project.artifactId}:v1</name>
    </image>
  </configuration>
</plugin>

راځئ چې د دې کولو لپاره میون وکاروو build-imageد غوښتنلیک رامینځته کولو او د کانټینر عکس رامینځته کولو اهداف. موږ پدې وخت کې هیڅ ډاکر فایلونه نه کاروو.

mvn spring-boot:build-image

پایله به یې داسې وي:

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ usersignup ---
[INFO] Building image 'docker.io/pratikdas/usersignup:v1'
[INFO] 
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
.
.
.. [creator]     Adding label 'org.springframework.boot.version'
.. [creator]     *** Images (c311fe74ec73):
.. [creator]           docker.io/pratikdas/usersignup:v1
[INFO] 
[INFO] Successfully built image 'docker.io/pratikdas/usersignup:v1'

د محصول څخه موږ دا ګورو paketo Cloud-Native buildpackد کاري OCI عکس جوړولو لپاره کارول کیږي. لکه څنګه چې دمخه ، موږ کولی شو د کمانډ په چلولو سره د ډاکر عکس په توګه لیست شوي عکس وګورو:

docker images 

پایله:

REPOSITORY                             SIZE
paketobuildpacks/run                  84.3MB
gcr.io/paketo-buildpacks/builder      652MB
pratikdas/usersignup                  257MB

د جیب په کارولو سره د کانټینر عکس رامینځته کول

جیب د ګوګل څخه د عکس جوړولو پلگ ان دی چې د سرچینې کوډ څخه د کانټینر عکس رامینځته کولو لپاره بدیل میتود چمتو کوي.

جوړول jib-maven-pluginپه pom.xml کې:

      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>2.5.2</version>
      </plugin>

بیا ، موږ د اپلیکیشن جوړولو او د کانټینر عکس رامینځته کولو لپاره د ماون کمانډ په کارولو سره جیب پلگ ان چلوو. لکه څنګه چې مخکې، موږ دلته د ډاکر فایلونه نه کاروو:

mvn compile jib:build -Dimage=<docker registry name>/usersignup:v1

د پورته Maven کمانډ اجرا کولو وروسته، موږ لاندې محصول ترلاسه کوو:

[INFO] Containerizing application to pratikdas/usersignup:v1...
.
.
[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, io.pratik.users.UsersignupApplication]
[INFO] 
[INFO] Built and pushed image as pratikdas/usersignup:v1
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete

محصول ښیې چې د کانټینر عکس رامینځته شوی او په راجسټری کې ځای په ځای شوی.

د مطلوب انځورونو جوړولو لپاره هڅونې او تخنیکونه

موږ د اصلاح کولو دوه اصلي لاملونه لرو:

  • محصولات: د کانټینر آرکیسټریشن سیسټم کې ، د کانټینر عکس د عکس راجسټرې څخه کوربه ته د کانټینر انجن پرمخ وړل کیږي. دې پروسې ته پلان جوړونه ویل کیږي. د راجسټری څخه د لوی عکسونو ایستل د کانټینر آرکیسټریشن سیسټمونو کې د اوږد مهالویش وختونو او د CI پایپ لاینونو کې د اوږد جوړیدو وختونو پایله لري.
  • امنیت: لوی انځورونه هم د زیان منونکو لپاره لویه ساحه لري.

د ډاکر عکس د پرتونو سټیک څخه جوړ دی ، چې هر یو یې زموږ په ډاکر فایل کې لارښوونې څرګندوي. هره طبقه په لاندې پرت کې د بدلونونو ډیلټا استازیتوب کوي. کله چې موږ د راجسټری څخه د ډاکر عکس راوباسئ ، دا په پرتونو کې ایستل کیږي او په کوربه کې ساتل کیږي.

د پسرلي بوټ کارول "چټک JAR" په کې د ډیفالټ بسته بندۍ بڼه. کله چې موږ موټ JAR ته ګورو، موږ ګورو چې غوښتنلیک د ټول JAR ډیره کوچنۍ برخه جوړوي. دا هغه برخه ده چې ډیری وختونه بدلیږي. پاتې برخه د پسرلي چوکاټ د انحصاراتو څخه جوړه ده.

د اصلاح کولو فورمول د پسرلي چوکاټ له انحصار څخه په جلا کچه د غوښتنلیک جلا کولو شاوخوا مرکزونه لري.

د انحصار پرت، چې د JAR د فايل ډیری برخه جوړوي، یوازې یو ځل ډاونلوډ کیږي او په کوربه سیسټم کې ساتل کیږي.

د غوښتنلیک تازه کولو او کانټینر مهالویش پرمهال د غوښتنلیک یوازې یو پتلی پرت ایستل کیږي. لکه څنګه چې په دې انځور کې ښودل شوي:

د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

په لاندې برخو کې، موږ به وګورو چې څنګه د پسرلي بوټ غوښتنلیک لپاره دا غوره شوي انځورونه جوړ کړو.

د بلډپیک په کارولو سره د پسرلي بوټ غوښتنلیک لپاره د غوره شوي کانټینر عکس رامینځته کول

د پسرلي بوټ 2.3 په جلا پرتونو کې د یو موټی JAR فایل برخې په استخراج سره د پرتونو ملاتړ کوي. د پرت کولو خصوصیت د ډیفالټ لخوا غیر فعال شوی او باید د پسرلي بوټ ماون پلگ ان په کارولو سره په واضح ډول فعال شي:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <layers>
      <enabled>true</enabled>
    </layers>
  </configuration> 
</plugin>

موږ به دا ترتیب د خپل کانټینر عکس جوړولو لپاره وکاروو لومړی د بلډپیک سره او بیا په لاندې برخو کې د ډاکر سره.

راځئ چې پیل کړو build-imageد کانټینر عکس جوړولو لپاره د ماون هدف:

mvn spring-boot:build-image

که موږ په پایله شوي عکس کې د پرتونو لیدلو لپاره ډوب چلوو، موږ لیدلی شو چې د غوښتنلیک پرت (په سور کې ښودل شوی) د کیلوبایټ رینج کې خورا کوچنی دی د هغه څه په پرتله چې موږ د موټ JAR فارمیټ څخه کار اخلو:

د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

د ډاکر په کارولو سره د پسرلي بوټ غوښتنلیک لپاره د مطلوب کانټینر عکس رامینځته کول

د Maven یا Gradle پلگ ان کارولو پرځای، موږ کولی شو د Docker فایل سره یو پرت شوی Docker JAR عکس هم جوړ کړو.

کله چې موږ ډاکر کاروو ، موږ اړتیا لرو د پرتونو ایستلو لپاره دوه اضافي مرحلې ترسره کړو او په وروستي عکس کې یې کاپي کړو.

د لیرینګ فعالولو سره د ماون کارولو وروسته د پایله شوي JAR مینځپانګې به داسې ښکاري:

META-INF/
.
BOOT-INF/lib/
.
BOOT-INF/lib/spring-boot-jarmode-layertools-2.3.3.RELEASE.jar
BOOT-INF/classpath.idx
BOOT-INF/layers.idx

محصول د JAR په نوم اضافي ښیي spring-boot-jarmode-layertoolsи layersfle.idxدوتنه. دا اضافي JAR فایل د پرتې پروسس کولو وړتیاوې چمتو کوي، لکه څنګه چې په راتلونکې برخه کې تشریح شوي.

په انفرادي پرتونو کې د انحصار استخراج

زموږ د پرت شوي JAR څخه د پرتونو لیدو او استخراج لپاره، موږ د سیسټم ملکیت کاروو -Djarmode=layertoolsد پیل لپاره spring-boot-jarmode-layertoolsد غوښتنلیک پر ځای JAR:

java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar

د دې کمانډ چلول محصول تولیدوي چې د موجود کمانډ اختیارونه لري:

Usage:
  java -Djarmode=layertools -jar usersignup-0.0.1-SNAPSHOT.jar

Available commands:
  list     List layers from the jar that can be extracted
  extract  Extracts layers from the jar for image creation
  help     Help about any command

محصول حکمونه ښیې listextractи helpс helpډیفالټ وي. راځئ چې کمانډ سره پرمخ بوځو listاختیار:

java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
dependencies
spring-boot-loader
snapshot-dependencies
application

موږ د انحصارونو لیست ګورو چې د پرتونو په توګه اضافه کیدی شي.

ډیفالټ پرتونه:

د پرت نوم

منځپانګې

dependencies

هر ډول انحصار چې نسخه یې SNAPSHOT نلري

spring-boot-loader

د JAR لوډر ټولګي

snapshot-dependencies

هر ډول انحصار چې نسخه یې SNAPSHOT لري

application

د غوښتنلیک ټولګي او سرچینې

پرتونه په کې تعریف شوي دي layers.idxفایل په ترتیب کې دوی باید د ډاکر عکس کې اضافه شي. دا پرتونه د لومړي ترلاسه کولو وروسته په کوربه کې ساتل کیږي ځکه چې دوی بدلون نه کوي. یوازې تازه شوي غوښتنلیک پرت کوربه ته ډاونلوډ شوی ، کوم چې د کم شوي اندازې له امله ګړندی دی .

د انحصار سره د عکس جوړول په جلا پرتونو کې ایستل شوي

موږ به وروستی عکس په دوه مرحلو کې د میتود په کارولو سره جوړ کړو څو مرحلې مجلس . په لومړي ګام کې به موږ انحصارونه استخراج کړو او په دویمه مرحله کې به موږ استخراج شوي انحصارونه په وروستي عکس کې کاپي کړو.

راځئ چې د څو مرحلې جوړونې لپاره زموږ ډاکر فایل ترمیم کړو:

# the first stage of our build will extract the layers
FROM adoptopenjdk:14-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

# the second stage of our build will copy the extracted layers
FROM adoptopenjdk:14-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

موږ دا ترتیب په جلا فایل کې خوندي کوو - Dockerfile2.

موږ د کمانډ په کارولو سره د ډاکر عکس جوړوو:

docker build -f Dockerfile2 -t usersignup:v1 .

د دې کمانډ چلولو وروسته موږ لاندې محصول ترلاسه کوو:

Sending build context to Docker daemon  20.41MB
Step 1/12 : FROM adoptopenjdk:14-jre-hotspot as builder
14-jre-hotspot: Pulling from library/adoptopenjdk
.
.
Successfully built a9ebf6970841
Successfully tagged userssignup:v1

موږ لیدلی شو چې د ډاکر عکس د عکس ID سره رامینځته شوی او بیا ټګ شوی.

په نهایت کې ، موږ د ډیو کمانډ چلوو لکه څنګه چې د تولید شوي ډاکر عکس دننه پرتونو معاینه کوو. موږ کولی شو د Dive کمانډ ته د ننوتلو په توګه د عکس ID یا ټاګ چمتو کړو:

dive userssignup:v1

لکه څنګه چې تاسو په محصول کې لیدلی شئ، هغه پرت چې غوښتنلیک لري اوس یوازې 11 KB دی، او انحصار په جلا پرتونو کې ساتل کیږي. 

د پسرلي بوټ غوښتنلیک لپاره مطلوب ډاکر عکسونه رامینځته کول

په انفرادي پرتونو کې د داخلي انحصار استخراج

موږ کولی شو د غوښتنلیک درجې اندازه نوره هم راټیټ کړو چې زموږ د ګمرکي انحصارونو څخه په جلا ټایر کې استخراج کولو سره د غوښتنلیک سره بسته کولو پرځای د دوی اعلانولو سره. ymlورته فایل نومول شوی layers.idx:

- "dependencies":
  - "BOOT-INF/lib/"
- "spring-boot-loader":
  - "org/"
- "snapshot-dependencies":
- "custom-dependencies":
  - "io/myorg/"
- "application":
  - "BOOT-INF/classes/"
  - "BOOT-INF/classpath.idx"
  - "BOOT-INF/layers.idx"
  - "META-INF/"

په دې فایل کې layers.idxموږ د دودیز انحصار نوم اضافه کړی دی، io.myorgد سازمان انحصار لري چې د ګډ ذخیره څخه ترلاسه شوي.

پایلې

پدې مقاله کې ، موږ د سرچینې کوډ څخه مستقیم د کانټینر عکس رامینځته کولو لپاره د Cloud-Native Buildpacks کارولو ته ګورو. دا د معمول ډول د کانټینر عکس رامینځته کولو لپاره د ډاکر کارولو بدیل دی: لومړی د موټ اجرا وړ JAR فایل رامینځته کول او بیا یې د ډاکر فایل کې لارښوونې مشخص کولو سره د کانټینر عکس کې بسته کول.

موږ د لیرینګ خصوصیت په فعالولو سره زموږ د کانټینر اصلاح کولو ته هم ګورو چې انحصارونه په جلا پرتونو کې راوباسي چې په کوربه کې ساتل شوي او د غوښتنلیک یو پتلی پرت د کانټینر اجرا کولو انجنونو کې د مهالویش په وخت کې بار شوی.

تاسو کولی شئ په مقاله کې کارول شوي ټول سرچینې کوډ ومومئ Github .

د قوماندې حواله

دلته د هغه کمانډونو ګړندۍ لړۍ ده چې موږ پدې مقاله کې کارولې.

د شرایطو پاکول:

docker system prune -a

د ډاکر فایل په کارولو سره د کانټینر عکس رامینځته کول:

docker build -f <Docker file name> -t <tag> .

موږ د کانټینر عکس د سرچینې کوډ څخه جوړوو (پرته د ډاکر فایل):

mvn spring-boot:build-image

د انحصار پرتونه وګورئ. د غوښتنلیک JAR فایل جوړولو دمخه، ډاډ ترلاسه کړئ چې د پرت کولو ځانګړتیا په پسرلي-بوټ-ماین-پلگ ان کې فعاله شوې ده:

java -Djarmode=layertools -jar application.jar list

د انحصار پرتونو استخراج. د غوښتنلیک JAR فایل جوړولو دمخه، ډاډ ترلاسه کړئ چې د پرت کولو ځانګړتیا په پسرلي-بوټ-ماین-پلگ ان کې فعاله شوې ده:

 java -Djarmode=layertools -jar application.jar extract

د کانټینر عکسونو لیست وګورئ

docker images

د کانټینر عکس دننه کیڼ اړخ ته وګورئ (ډاډه کړئ چې د ډوب وسیله نصب شوې ده):

dive <image ID or image tag>

سرچینه: www.habr.com