Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

Ua lilo nā pahu i mea i makemake ʻia no ka hoʻopaʻa ʻana i kahi noi me kāna mau polokalamu a me nā ʻōnaehana hana hilinaʻi a laila hāʻawi iā lākou i nā kaiapuni like ʻole.

Hoʻopili kēia ʻatikala i nā ala like ʻole e hoʻopaʻa ai i kahi noi Spring Boot:

  • ka hana ʻana i kahi kiʻi Docker me ka hoʻohana ʻana i kahi faila Docker,
  • ke kūkulu ʻana i kiʻi OCI mai ke kumu me ka hoʻohana ʻana i Cloud-Native Buildpack,
  • a me ka hoʻolālā kiʻi i ka wā holo ma o ka hoʻokaʻawale ʻana i nā ʻāpana JAR i nā pae like ʻole me ka hoʻohana ʻana i nā mea hana papa.

 Laʻana code

Hoʻopili ʻia kēia ʻatikala me kahi laʻana code hana ma GitHub .

Hua'ōlelo pahu

E hoʻomaka mākou me nā huaʻōlelo pahu i hoʻohana ʻia ma ka ʻatikala:

  • Kiʻi pahu: he waihona o kahi ʻano kikoʻī. Hoʻololi mākou i kā mākou noi i kahi kiʻi pahu ma ka holo ʻana i ka mea hana kūkulu.
  • Container: He mea hoʻokō o ke kiʻi pahu.
  • ʻenekini pahu pahu: ʻO ke kaʻina hana daemon ke kuleana no ka holo ʻana i ka ipu.
  • Mea hoʻokipa pahu: ʻO ka mīkini hoʻokipa kahi e holo ai ka mīkini pahu.
  • Kakau waihona: Ka wahi maʻamau i hoʻohana ʻia no ka paʻi ʻana a me ka puʻunaue ʻana i ke kiʻi pahu.
  • OCI maʻamauOpen Container Initiative (OCI) he papa hana hoʻokele māmā a wehe ʻia e ka Linux Foundation. Hōʻike ka OCI Image Specification i nā kūlana ʻoihana no nā kiʻi pahu pahu a me ka manawa holo e hōʻoia i hiki i nā mīkini pahu āpau ke holo i nā kiʻi ipu i hana ʻia e kekahi mea hana.

No ka hoʻopaʻa ʻana i kahi palapala noi, kāʻei mākou i kā mākou palapala noi i kahi kiʻi pahu a hoʻolaha i kēlā kiʻi i ka papa inoa o ka lehulehu. Hoʻihoʻi ka pahu runtime i kēia kiʻi mai ka papa inoa, wehe iā ia, a holo i ka noi i loko.

Hāʻawi ka mana 2.3 o Spring Boot i nā plugins no ke kūkulu ʻana i nā kiʻi OCI.

Docker ʻo ia ka hoʻokō maʻamau o ka pahu, a hoʻohana mākou iā Docker i kā mākou mau hiʻohiʻona, no laila e pili ana nā kuhikuhi pahu a pau i kēia ʻatikala iā Docker.

Ke kūkulu ʻana i kiʻi ipu ma ke ʻano kuʻuna

Maʻalahi loa ke kūkulu ʻana i nā kiʻi Docker no nā noi Spring Boot ma ka hoʻohui ʻana i kekahi mau ʻōlelo kuhikuhi i kāu Dockerfile.

Hana mua mākou i kahi JAR hiki ke hoʻokō a, ma ke ʻano he ʻāpana o nā ʻōlelo Dockerfile, kope i ka JAR executable ma luna o ke kiʻi JRE kumu ma hope o ka hoʻohana ʻana i nā hana maʻamau.

E hana mākou i kā mākou polokalamu Spring ma Puna Initializr me nā mea hilinaʻi weblombokи actuator. Hoʻohui pū mākou i kahi mea hoʻomaha hoʻomaha e hāʻawi i kahi API me GETʻano hana.

Ke hana nei i kahi Dockerfile

A laila hoʻokomo mākou i kēia noi i loko o kahi pahu me ka hoʻohui Dockerfile:

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

Loaʻa i kā mākou Dockerfile kahi kiʻi kumu, mai adoptopenjdk, ma luna a mākou e kope ai i kā mākou faila JAR a laila wehe i ke awa, 8080ka mea e hoolohe i na noi.

Hui noi

Pono mua ʻoe e hana i kahi noi me ka hoʻohana ʻana iā Maven a i ʻole Gradle. Eia mākou e hoʻohana nei iā Maven:

mvn clean package

Hoʻokumu kēia i kahi faila JAR hoʻokō no ka noi. Pono mākou e hoʻololi i kēia JAR hoʻokō i kahi kiʻi Docker e holo ma ka mīkini Docker.

E hana i kahi kiʻi pahu

A laila hoʻokomo mākou i kēia JAR i hoʻokō ʻia i ke kiʻi Docker ma ka holo ʻana i ke kauoha docker buildmai ka papa kuhikuhi kumu papahana i loaʻa ka Dockerfile i hana mua ʻia:

docker build  -t usersignup:v1 .

Hiki iā mākou ke ʻike i kā mākou kiʻi ma ka papa inoa me ke kauoha:

docker images 

ʻO ka hoʻopuka o ke kauoha i luna me kā mākou kiʻi usersignupme ke kiʻi kumu, adoptopenjdki kuhikuhi ʻia ma kā mākou Dockerfile.

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

Nānā i nā papa i loko o kahi kiʻi ipu

E nānā kākou i ka ahu o nā papa i loko o ke kiʻi. E hoʻohana mākou mea kani  luʻu e nānā i kēia mau papa:

dive usersignup:v1

Eia kekahi ʻāpana o ka puka o ke kauoha Dive: 

Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

E like me kā mākou e ʻike ai, hana ka papa noi i kahi ʻāpana nui o ka nui o ke kiʻi. Makemake mākou e hoʻemi i ka nui o kēia papa ma nā ʻāpana aʻe ma ke ʻano o kā mākou loiloi.

Ke hana ʻana i kahi kiʻi pahu me ka hoʻohana ʻana iā Buildpack

Nā pūʻolo hui (Buildpacks) he huaʻōlelo maʻamau i hoʻohana ʻia e nā makana Platform as a Service (PAAS) e hana i kahi kiʻi pahu mai ka code kumu. Ua hoʻokuʻu ʻia e Heroku i ka makahiki 2011 a ua lawe ʻia e Cloud Foundry, Google App Engine, Gitlab, Knative a me kekahi mau mea ʻē aʻe.

Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

Pōmaikaʻi o Cloud Build Packages

ʻO kekahi o nā pono nui o ka hoʻohana ʻana iā Buildpack e kūkulu i nā kiʻi ʻo ia Hiki ke mālama ʻia nā hoʻololi hoʻonohonoho kiʻi ma ke kikowaena (mea kūkulu hale) a hoʻolaha i nā noi āpau me ka hoʻohana ʻana i ka mea hana.

Ua pili pono nā pūʻolo kūkulu i ka paepae. Hāʻawi ʻo Cloud-Native Buildpacks i ka standardization ma waena o nā paepae ma ke kākoʻo ʻana i ke ʻano kiʻi kiʻi OCI, e hōʻoiaʻiʻo ana e hiki ke holo ʻia ke kiʻi e ka mīkini Docker.

Ke hoʻohana nei i ka Spring Boot Plugin

Hoʻokumu ka Spring Boot plugin i nā kiʻi OCI mai ke kumu me Buildpack. Hana ʻia nā kiʻi me ka hoʻohana ʻana bootBuildImagenā hana (Gradle) a i ʻole spring-boot:build-imagetarget (Maven) a me ka hoʻonohonoho Docker kūloko.

Hiki iā mākou ke hana i ka inoa o ke kiʻi e pono ai mākou e pana i ka Docker registry ma ke kuhikuhi ʻana i ka inoa i loko 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>

E hoʻohana kākou iā Maven e hoʻokō build-imagenā pahuhopu no ka hana ʻana i kahi noi a me ka hana ʻana i kahi kiʻi pahu. ʻAʻole mākou e hoʻohana nei i nā Dockerfiles.

mvn spring-boot:build-image

ʻO ka hopena e like me kēia:

[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'

Mai ka hopena, ʻike mākou i kēlā paketo Cloud-Native buildpackhoʻohana ʻia e hana i kahi kiʻi OCI hana. E like me ka wā ma mua, hiki iā mākou ke ʻike i ke kiʻi i helu ʻia ma ke ʻano he kiʻi Docker ma ka holo ʻana i ke kauoha:

docker images 

Panina:

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

Ke hana ʻana i kahi kiʻi pahu me Jib

ʻO Jib kahi plugin hana kiʻi mai Google e hāʻawi i kahi ala ʻē aʻe no ka hana ʻana i kahi kiʻi pahu mai ka code kumu.

Ke hoʻonohonoho nei jib-maven-pluginma ka pom.xml:

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

A laila, holo mākou i ka plugin Jib me ka hoʻohana ʻana i ke kauoha Maven e kūkulu i ka noi a hana i ke kiʻi pahu. E like me ka wā ma mua, ʻaʻole mākou e hoʻohana i nā Dockerfiles ma aneʻi:

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

Ma hope o ka hoʻokō ʻana i ke kauoha Maven i luna, loaʻa iā mākou ka hopena aʻe:

[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

Hōʻike ka mea hoʻopuka ua hana ʻia ke kiʻi pahu a waiho ʻia i loko o ka papa inoa.

Nā hoʻoikaika a me nā ʻano hana no ka hana ʻana i nā kiʻi i hoʻopaʻa ʻia

Loaʻa iā mākou ʻelua kumu nui no ka hoʻonui ʻana:

  • 'Ohanahana: I loko o kahi ʻōnaehana hoʻokani pahu, kiʻi ʻia kahi kiʻi pahu mai ka papa inoa kiʻi i ka mea hoʻokipa e holo ana i ka mīkini pahu. Kapa ʻia kēia kaʻina hana hoʻolālā. ʻO ka huki ʻana i nā kiʻi nui mai ka papa inoa e hopena i nā manawa hoʻonohonoho lōʻihi i nā ʻōnaehana orchestration pahu a me nā manawa kūkulu lōʻihi i nā pipeline CI.
  • Ka maluhia: Loaʻa i nā kiʻi ʻoi aku kahi ʻāpana nui no nā nāwaliwali.

Hoʻokumu ʻia kahi kiʻi Docker i kahi papa o nā papa, kēlā me kēia mea e hōʻike ana i kahi ʻōlelo i kā mākou Dockerfile. Hōʻike kēlā me kēia papa i ka delta o nā hoʻololi i ka papa lalo. Ke huki mākou i kahi kiʻi Docker mai ka papa inoa, huki ʻia i nā papa a hūnā ʻia ma ka host.

Hoʻohana ʻia ka Spring Boot "momona JAR" ma e like me ke ʻano paʻa paʻa. Ke nānā mākou i kahi JAR momona, ʻike mākou he wahi liʻiliʻi loa ka noi o ka JAR holoʻokoʻa. ʻO kēia ka ʻāpana e hoʻololi loa. Aia ke koena i nā hilinaʻi Spring Framework.

Hoʻokumu ʻia ke ʻano hoʻohālikelike i ka hoʻokaʻawale ʻana i ka noi ma kahi pae ʻokoʻa mai nā hilinaʻi Spring Framework.

Hoʻoiho ʻia ka papa hilinaʻi e hoʻokumu i ka nui o ka faila JAR mānoanoa i hoʻokahi wale nō a hūnā ʻia ma ka ʻōnaehana hoʻokipa.

ʻO kahi ʻāpana lahilahi wale nō o ka app i huki ʻia i ka wā o ka hoʻonui ʻana i ka app a me ka hoʻonohonoho pahu, e like me ka mea i hoikeia ma keia kii:

Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

Ma nā ʻāpana aʻe, e nānā mākou i ka hana ʻana i kēia mau kiʻi i hoʻopaʻa ʻia no kahi noi Spring Boot.

Ke kūkulu ʻana i kahi kiʻi pahu i hoʻopaʻa ʻia no kahi noi pūnāwai me Buildpack

Kākoʻo ʻo Spring Boot 2.3 i ka waiho ʻana ma ka unuhi ʻana i nā ʻāpana o kahi faila JAR mānoanoa i nā papa ʻokoʻa. Hoʻopau ʻia ka hiʻohiʻona layering ma ka paʻamau a pono e hoʻohana ʻia me ka hoʻohana ʻana i ka plugin Spring Boot Maven:

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

E hoʻohana mākou i kēia hoʻonohonoho e kūkulu mua i kā mākou kiʻi pahu me Buildpack a laila me Docker ma nā ʻāpana aʻe.

E holo kāua build-imagePahu maven no ka hana ʻana i ke kiʻi pahu:

mvn spring-boot:build-image

Inā mākou e holo i ka Dive e ʻike i nā ʻāpana o ke kiʻi i loaʻa, ʻike mākou he ʻoi aku ka liʻiliʻi o ka papa noi (a puni i ka ʻulaʻula) i ka laulā kilobyte i hoʻohālikelike ʻia i ka mea i loaʻa iā mākou me ka hoʻohana ʻana i ka format JAR mānoanoa:

Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

Ke kūkulu ʻana i kahi kiʻi i hoʻopaʻa ʻia no kahi noi Spring Boot me Docker

Ma kahi o ka hoʻohana ʻana i kahi plugin Maven a Gradle, hiki iā mākou ke hana i kahi kiʻi Docker JAR layered me kahi faila Docker.

Ke hoʻohana mākou iā Docker, pono mākou e hana i ʻelua mau ʻanuʻu hou e unuhi i nā papa a kope iā lākou i ke kiʻi hope loa.

ʻO nā ʻike o ka JAR i loaʻa ma hope o ke kūkulu ʻana me ka hoʻohana ʻana iā Maven me ka layering enabled e like me kēia:

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

Hōʻike ka hopena i kahi JAR hou i kapa ʻia spring-boot-jarmode-layertoolsи layersfle.idxwaihona. Hāʻawi kēia waihona JAR hou i nā hiki ke hoʻoili ʻia, e like me ka wehewehe ʻana ma ka ʻāpana aʻe.

Ka unuhi ʻana i nā hilinaʻi ma nā papa pākahi

No ka nānā ʻana a me ka unuhi ʻana i nā papa mai kā mākou JAR layered, hoʻohana mākou i ka waiwai ʻōnaehana -Djarmode=layertoolsno ka hoomaka ana spring-boot-jarmode-layertoolsJAR ma kahi o ka noi:

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

ʻO ka holo ʻana i kēia kauoha e hoʻopuka i kahi huahana i loaʻa nā koho kauoha i loaʻa:

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

Hōʻike ka huahana i nā kauoha listextractи helpс helpe lilo i mea paʻamau. E holo kāua i ke kauoha me listkoho:

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

ʻIke mākou i kahi papa inoa o nā hilinaʻi hiki ke hoʻohui ʻia ma ke ʻano he papa.

Nā papa ma ka paʻamau:

inoa papa

Nā mea

dependencies

kekahi hilinaʻi nona ka mana ʻaʻole i loaʻa iā SNAPSHOT

spring-boot-loader

Nā Papa Loader JAR

snapshot-dependencies

kekahi hilinaʻi nona ka mana i loaʻa iā SNAPSHOT

application

nā papa noi a me nā kumuwaiwai

Ua wehewehe ʻia nā papa ma layers.idxfaila i ke kauoha e hoʻohui ʻia i ke kiʻi Docker. Hoʻopili ʻia kēia mau papa i loko o ka mea hoʻokipa ma hope o ka loaʻa mua ʻana no ka mea ʻaʻole lākou e loli. Hoʻoiho wale ʻia ka papa noi hou i ka host, ʻoi aku ka wikiwiki ma muli o ka liʻiliʻi .

Ke kūkulu ʻana i kiʻi me nā hilinaʻi i unuhi ʻia i loko o nā papa ʻokoʻa

E kūkulu mākou i ke kiʻi hope i ʻelua mau ʻanuʻu me ka hoʻohana ʻana i kahi ala i kapa ʻia hui nui-pae . Ma ka hana mua e unuhi mākou i nā hilinaʻi a ma ka ʻanuʻu ʻelua e kope mākou i nā hilinaʻi i unuhi ʻia i ke kiʻi hope.

E hoʻololi i kā mākou Dockerfile no kahi kūkulu ʻana i nā pae he nui:

# 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"]

Mālama mākou i kēia hoʻonohonoho i kahi faila ʻokoʻa - Dockerfile2.

Kūkulu mākou i ke kiʻi Docker me ke kauoha:

docker build -f Dockerfile2 -t usersignup:v1 .

Ma hope o ka hoʻokō ʻana i kēia kauoha, loaʻa iā mākou ka hopena aʻe:

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

Hiki iā mākou ke ʻike ua hana ʻia ke kiʻi Docker me kahi ID kiʻi a laila kau inoa ʻia.

ʻO ka hope, holo mākou i ke kauoha Dive e like me ka wā ma mua e nānā i nā papa i loko o ke kiʻi Docker i hana ʻia. Hiki iā mākou ke hāʻawi i kahi kiʻi kiʻi a i ʻole hōʻailona ma ke ʻano he hoʻokomo i ke kauoha Dive:

dive userssignup:v1

E like me kāu e ʻike ai mai ka hoʻopuka ʻana, ʻo 11 KB wale nō ka papa i loaʻa i ka noi a ua hūnā ʻia nā mea hilinaʻi i nā papa ʻokoʻa. 

Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot

Wehe i nā hilinaʻi kūloko ma nā papa ʻokoʻa

Hiki iā mākou ke hōʻemi hou i ka nui o ka papa noi ma ka unuhi ʻana i kekahi o kā mākou mau hilinaʻi maʻamau i kahi papa ʻokoʻa ma mua o ka hoʻopili ʻana iā lākou me ka noi ma ka haʻi ʻana iā lākou i loko. ymlfile like i kapa ʻia 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/"

Ma keia waihona layers.idxua hoʻohui mākou i kahi hilinaʻi maʻamau i kapa ʻia, io.myorgloaʻa nā hilinaʻi o ka hui i kiʻi ʻia mai kahi waihona waihona.

hopena

Ma kēia ʻatikala, ua nānā mākou i ka hoʻohana ʻana i Cloud-Native Buildpacks e kūkulu i kahi kiʻi pahu mai ke kumu. He mea ʻokoʻa kēia i ka hoʻohana ʻana iā Docker e hana i kahi kiʻi pahu ma ke ʻano maʻamau: ʻo ka mea mua, hana ʻia kahi faila JAR hiki ke hoʻokō ʻia a laila hoʻopili ʻia i loko o kahi kiʻi pahu ma ke kuhikuhi ʻana i nā kuhikuhi i ka Dockerfile.

Ua nānā pū mākou i ka hoʻomaikaʻi ʻana i kā mākou pahu ma ka hoʻokomo ʻana i kahi hiʻohiʻona layering e unuhi i nā hilinaʻi i nā ʻāpana ʻokoʻa i hūnā ʻia ma ka host a ua hoʻouka ʻia kahi papa noi lahilahi i ka manawa hoʻonohonoho i nā mīkini hoʻokō o ka ipu.

Hiki iā ʻoe ke loaʻa nā code kumu a pau i hoʻohana ʻia ma ka ʻatikala ma Github .

Kuhikuhi Kauoha

Eia kahi papa kuhikuhi wikiwiki o nā kauoha a mākou i hoʻohana ai ma kēia ʻatikala.

Ka hoʻomaʻemaʻe ʻana i ka pōʻaiapili:

docker system prune -a

Ke hana nei i kahi kiʻi pahu e hoʻohana ana i kahi faila Docker:

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

E kūkulu i ke kiʻi pahu mai ke kumu (me ka ʻole Dockerfile):

mvn spring-boot:build-image

Nānā i nā papa hilinaʻi. Ma mua o ke kūkulu ʻana i ka faila jar app, e hōʻoia i ka hiki ʻana o ka hiʻohiʻona layering i ka spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Wehe i nā papa hilinaʻi. Ma mua o ke kūkulu ʻana i ka faila jar app, e hōʻoia i ka hiki ʻana o ka hiʻohiʻona layering i ka spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Nānā i ka papa inoa o nā kiʻi pahu

docker images

Nānā ma ka ʻaoʻao hema i loko o ke kiʻi ipu (e hoʻokomo pono i ka mea hana luʻu):

dive <image ID or image tag>

Source: www.habr.com