ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ืงื•ื ื˜ื™ื™ื ืจื™ื ื”ืคื›ื• ืœืืžืฆืขื™ ื”ืžื•ืขื“ืฃ ืœืืจื™ื–ืช ืืคืœื™ืงืฆื™ื” ืขื ื›ืœ ื”ืชืœื•ืช ื‘ืชื•ื›ื ื” ื•ื‘ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœื” ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืขื‘ื™ืจ ืื•ืชืŸ ืœืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช.

ืžืืžืจ ื–ื” ืžื›ืกื” ื“ืจื›ื™ื ืฉื•ื ื•ืช ืœื”ื›ื™ืœ ื™ื™ืฉื•ื Spring Boot ื‘ืžื›ื•ืœื”:

  • ื‘ื ื™ื™ืช ืชืžื•ื ืช docker ื‘ืืžืฆืขื•ืช dockerfile,
  • ื‘ื ื™ื™ืช ืชืžื•ื ืช OCI ืžืžืงื•ืจ ื‘ืืžืฆืขื•ืช Cloud-Native Buildpack,
  • ื•ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืชืžื•ื ื” ื‘ื–ืžืŸ ืจื™ืฆื” ืขืœ ื™ื“ื™ ื”ืคืจื“ืช ื—ืœืงื™ JAR ืœืจืžื•ืช ืฉื•ื ื•ืช ื‘ืืžืฆืขื•ืช ื›ืœื™ื ืฉื›ื‘ื•ืช.

 ื“ื•ื’ืžื” ืœืงื•ื“

ืžืืžืจ ื–ื” ืžืœื•ื•ื” ื‘ื“ื•ื’ืžื” ืฉืœ ืงื•ื“ ืขื‘ื•ื“ื” ื‘-GitHub .

ื˜ืจืžื™ื ื•ืœื•ื’ื™ื” ืฉืœ ืžื™ื›ืœ

ื ืชื—ื™ืœ ื‘ื˜ืจืžื™ื ื•ืœื•ื’ื™ื™ืช ื”ืžื›ื•ืœื” ื”ืžืฉืžืฉืช ืœืื•ืจืš ื”ืžืืžืจ:

  • ืชืžื•ื ืช ืžื™ื›ืœ: ืงื•ื‘ืฅ ื‘ืคื•ืจืžื˜ ืžืกื•ื™ื. ืื ื• ืžืžื™ืจื™ื ืืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืœืชืžื•ื ืช ืžื›ื™ืœ ืขืœ ื™ื“ื™ ื”ืคืขืœืช ื›ืœื™ ื”ื‘ื ื™ื™ื”.
  • ืžื›ื•ืœื”: ืžื•ืคืข ื‘ืจ ื”ืคืขืœื” ืฉืœ ืชืžื•ื ืช ื”ืžื›ื•ืœื”.
  • ืžื ื•ืข ืžื™ื›ืœ: ืชื”ืœื™ืš ื”ื“ืžื•ืŸ ืฉืื—ืจืื™ ืœื”ืคืขืœืช ื”ืงื•ื ื˜ื™ื™ื ืจ.
  • ืžืืจื— ืžื™ื›ืœ: ื”ืžื›ื•ื ื” ื”ืžืืจื— ืฉื‘ื” ืคื•ืขืœ ืžื ื•ืข ื”ืžื›ื•ืœื”.
  • ืจื™ืฉื•ื ืžื™ื›ืœ: ื”ืžื™ืงื•ื ื”ื›ืœืœื™ ื”ืžืฉืžืฉ ืœืคืจืกื•ื ื•ื”ืคืฆื” ืฉืœ ืชืžื•ื ืช ื”ืžื›ื•ืœื”.
  • ืชืงืŸ OCIื™ื•ื–ืžืช ืžื™ื›ืœ ืคืชื•ื—ื” (OCI) ื”ื™ื ืžืกื’ืจืช ื ื™ื”ื•ืœ ืงืœืช ืžืฉืงืœ ื‘ืงื•ื“ ืคืชื•ื— ืฉื ื•ืฆืจื” ืขืœ ื™ื“ื™ ืงืจืŸ ืœื™ื ื•ืงืก. ืžืคืจื˜ ื”ืชืžื•ื ื” ืฉืœ OCI ืžื’ื“ื™ืจ ืชืงื ื™ื ื‘ืชืขืฉื™ื™ื” ืขื‘ื•ืจ ืคื•ืจืžื˜ื™ื ืฉืœ ืชืžื•ื ืช ืงื•ื ื˜ื™ื™ื ืจ ื•ืืช ื–ืžืŸ ื”ืจื™ืฆื” ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื›ืœ ืžื ื•ืขื™ ื”ืžื›ื•ืœื” ื™ื›ื•ืœื™ื ืœื”ืจื™ืฅ ืชืžื•ื ื•ืช ืžื™ื›ืœ ืฉื ื•ืฆืจื• ืขืœ ื™ื“ื™ ื›ืœ ื›ืœื™ ื‘ื ื™ื™ื”.

ื›ื“ื™ ืœืื›ืœืก ืืคืœื™ืงืฆื™ื”, ืื ื• ืขื•ื˜ืคื™ื ืืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ื‘ืชืžื•ื ืช ืžื›ื™ืœ ื•ืžืคืจืกืžื™ื ืืช ื”ืชืžื•ื ื” ื”ื–ื• ืœืจื™ืฉื•ื ื”ืฆื™ื‘ื•ืจื™. ื–ืžืŸ ื”ืจื™ืฆื” ืฉืœ ืžื™ื›ืœ ืžืื—ื–ืจ ืชืžื•ื ื” ื–ื• ืžื”ืจื™ืฉื•ื, ืคื•ืจืง ืื•ืชื” ื•ืžืจื™ืฅ ืืช ื”ื™ื™ืฉื•ื ื‘ืชื•ื›ื”.

ื’ืจืกื” 2.3 ืฉืœ Spring Boot ืžืกืคืงืช ืชื•ืกืคื™ื ืœื‘ื ื™ื™ืช ืชืžื•ื ื•ืช OCI.

ืกึทื•ึธืจ ื”ื•ื ื”ืžื™ืžื•ืฉ ื”ื ืคื•ืฅ ื‘ื™ื•ืชืจ ืฉืœ ืงื•ื ื˜ื™ื™ื ืจ, ื•ืื ื• ืžืฉืชืžืฉื™ื ื‘-Docker ื‘ื“ื•ื’ืžืื•ืช ืฉืœื ื•, ื›ืš ืฉื›ืœ ื”ืคื ื™ื•ืช ื”ืงื•ื ื˜ื™ื™ื ืจ ื”ื‘ืื•ืช ื‘ืžืืžืจ ื–ื” ื™ืชื™ื™ื—ืกื• ืœ-Docker.

ื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ื‘ื“ืจืš ื”ืžืกื•ืจืชื™ืช

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ Spring Boot ื”ื™ื ืงืœื” ืžืื•ื“ ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ื›ืžื” ื”ื•ืจืื•ืช ืœ- Dockerfile ืฉืœืš.

ืื ื• ื™ื•ืฆืจื™ื ืชื—ื™ืœื” JAR ื‘ืจ ื”ืคืขืœื” ื•ื›ื—ืœืง ืžื”ื•ืจืื•ืช Dockerfile, ืžืขืชื™ืงื™ื ืืช ื”-JAR ืœื”ืคืขืœื” ืขืœ ื’ื‘ื™ ืชืžื•ื ืช JRE ื”ื‘ืกื™ืกื™ืช ืœืื—ืจ ื”ื—ืœืช ื”ื”ืชืืžื•ืช ื”ื ื—ื•ืฆื•ืช.

ื‘ื•ืื• ื ื™ืฆื•ืจ ืืช ืืคืœื™ืงืฆื™ื™ืช ื”ืื‘ื™ื‘ ืฉืœื ื• ื‘- ืจืืฉื•ื ื™ ื”ืื‘ื™ื‘ ืขื ืชืœื•ืช weblombokะธ actuator. ืื ื—ื ื• ื’ื ืžื•ืกื™ืคื™ื ื‘ืงืจ ืžื ื•ื—ื” ื›ื“ื™ ืœืกืคืง API ืขื GETืฉื™ื˜ื”.

ื™ืฆื™ืจืช Dockerfile

ืœืื—ืจ ืžื›ืŸ ืื ื• ืžื ื™ื—ื™ื ืืช ื”ื™ื™ืฉื•ื ื”ื–ื” ื‘ืžื™ื›ืœ ืขืœ ื™ื“ื™ ื”ื•ืกืคื” Dockerfile:

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

Dockerfile ืฉืœื ื• ืžื›ื™ืœ ืชืžื•ื ืช ื‘ืกื™ืก, ืž adoptopenjdk, ืฉืขืœื™ื• ืื ื• ืžืขืชื™ืงื™ื ืืช ืงื•ื‘ืฅ ื”-JAR ืฉืœื ื• ื•ืื– ืคื•ืชื—ื™ื ืืช ื”ื™ืฆื™ืื”, 8080ืืฉืจ ื™ืงืฉื™ื‘ ืœื‘ืงืฉื•ืช.

ื”ืจื›ื‘ืช ื™ื™ืฉื•ื

ืจืืฉื™ืช ืขืœื™ืš ืœื™ืฆื•ืจ ื™ื™ืฉื•ื ื‘ืืžืฆืขื•ืช Maven ืื• Gradle. ื›ืืŸ ืื ื• ืžืฉืชืžืฉื™ื ื‘-Maven:

mvn clean package

ื–ื” ื™ื•ืฆืจ ืงื•ื‘ืฅ JAR ื‘ืจ ื”ืคืขืœื” ืขื‘ื•ืจ ื”ื™ื™ืฉื•ื. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืžื™ืจ ืืช JAR ื”ื”ืคืขืœื” ื”ื–ื” ืœืชืžื•ื ืช Docker ื›ื“ื™ ืœืคืขื•ืœ ืขืœ ืžื ื•ืข Docker.

ืฆื•ืจ ืชืžื•ื ืช ืžื™ื›ืœ

ืœืื—ืจ ืžื›ืŸ ื”ื›ื ืกื ื• ืืช ืงื•ื‘ืฅ ื”ื”ืคืขืœื” ืฉืœ JAR ืœืชืžื•ื ื” ืฉืœ Docker ืขืœ ื™ื“ื™ ื”ืคืขืœืช ื”ืคืงื•ื“ื” docker buildืžืกืคืจื™ื™ืช ื”ืฉื•ืจืฉ ืฉืœ ื”ืคืจื•ื™ืงื˜ ื”ืžื›ื™ืœื” ืืช ื”-Dockerfile ืฉื ื•ืฆืจ ืงื•ื“ื ืœื›ืŸ:

docker build  -t usersignup:v1 .

ืื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช ืืช ื”ืชืžื•ื ื” ืฉืœื ื• ื‘ืจืฉื™ืžื” ืขื ื”ืคืงื•ื“ื”:

docker images 

ื”ืคืœื˜ ืฉืœ ื”ืคืงื•ื“ื” ืœืขื™ืœ ื›ื•ืœืœ ืืช ื”ืชืžื•ื ื” ืฉืœื ื• usersignupื™ื—ื“ ืขื ืชืžื•ื ืช ื”ื‘ืกื™ืก, adoptopenjdkื”ืžืฆื•ื™ืŸ ื‘- Dockerfile ืฉืœื ื•.

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

ื”ืฆื’ ืฉื›ื‘ื•ืช ื‘ืชื•ืš ืชืžื•ื ืช ืžื™ื›ืœ

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืขืจื™ืžืช ื”ืฉื›ื‘ื•ืช ื‘ืชื•ืš ื”ืชืžื•ื ื”. ืื ื—ื ื• ื ืฉืชืžืฉ ื›ืœื™  ืœึดืฆึฐืœื•ึนืœ, ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ื”ืฉื›ื‘ื•ืช ื”ืืœื”:

dive usersignup:v1

ื”ื ื” ื—ืœืง ืžื”ืคืœื˜ ืฉืœ ืคืงื•ื“ืช ื”ืฆืœื™ืœื”: 

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ื›ืคื™ ืฉืื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช, ืฉื›ื‘ืช ื”ื™ื™ืฉื•ื ืžื”ื•ื•ื” ื—ืœืง ื ื™ื›ืจ ืžื’ื•ื“ืœ ื”ืชืžื•ื ื”. ืื ื• ืจื•ืฆื™ื ืœื”ืงื˜ื™ืŸ ืืช ื’ื•ื“ืœ ื”ืฉื›ื‘ื” ื”ื–ื• ื‘ืกืขื™ืคื™ื ื”ื‘ืื™ื ื›ื—ืœืง ืžื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœื ื•.

ื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ืขื Buildpack

ื—ื‘ื™ืœื•ืช ื”ืจื›ื‘ื” (Buildpacks) ื”ื•ื ืžื•ื ื— ื›ืœืœื™ ื”ืžืฉืžืฉ ื”ืฆืขื•ืช ืฉื•ื ื•ืช ืฉืœ Platform as a Service (PAAS) ืœื™ืฆื™ืจืช ืชืžื•ื ืช ืžื™ื›ืœ ืžืงื•ื“ ื”ืžืงื•ืจ. ื”ื•ื ื”ื•ืฉืง ืขืœ ื™ื“ื™ Heroku ื‘ืฉื ืช 2011 ื•ืžืื– ืื•ืžืฅ ืขืœ ื™ื“ื™ Cloud Foundry, Google App Engine, Gitlab, Knative ื•ืขื•ื“ ื›ืžื”.

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ื”ื™ืชืจื•ืŸ ืฉืœ ื—ื‘ื™ืœื•ืช ื‘ื ื™ื™ืช ืขื ืŸ

ืื—ื“ ื”ื™ืชืจื•ื ื•ืช ื”ืขื™ืงืจื™ื™ื ืฉืœ ื”ืฉื™ืžื•ืฉ ื‘-Buildpack ืœื‘ื ื™ื™ืช ืชืžื•ื ื•ืช ื”ื•ื ื–ื” ื ื™ืชืŸ ืœื ื”ืœ ืฉื™ื ื•ื™ื™ื ื‘ืชืฆื•ืจืช ืชืžื•ื ื” ื‘ืื•ืคืŸ ืžืจื›ื–ื™ (ื‘ื•ื ื”) ื•ืœื”ืคื™ืฅ ืื•ืชื ืœื›ืœ ื”ื™ื™ืฉื•ืžื™ื ื”ืžืฉืชืžืฉื™ื ื‘ื‘ื•ื ื”.

ื—ื‘ื™ืœื•ืช ื”ื‘ื ื™ื™ื” ื”ื™ื• ืงืฉื•ืจื•ืช ืงืฉืจ ื”ื“ื•ืง ืœืคืœื˜ืคื•ืจืžื”. Cloud-Native Buildpacks ืžืกืคืงื™ื ืกื˜ื ื“ืจื˜ื™ื–ืฆื™ื” ื‘ื™ืŸ ืคืœื˜ืคื•ืจืžื•ืช ืขืœ ื™ื“ื™ ืชืžื™ื›ื” ื‘ืคื•ืจืžื˜ ื”ืชืžื•ื ื” OCI, ืžื” ืฉืžื‘ื˜ื™ื— ืฉื ื™ืชืŸ ืœื”ืคืขื™ืœ ืืช ื”ืชืžื•ื ื” ืขืœ ื™ื“ื™ ืžื ื•ืข Docker.

ืฉื™ืžื•ืฉ ื‘ืชื•ืกืฃ Spring Boot

ื”ืชื•ืกืฃ Spring Boot ื‘ื•ื ื” ืชืžื•ื ื•ืช OCI ืžืžืงื•ืจ ื‘ืืžืฆืขื•ืช Buildpack. ืชืžื•ื ื•ืช ื ื•ืฆืจื•ืช ื‘ืืžืฆืขื•ืช bootBuildImageืžืฉื™ืžื•ืช (Gradle) ืื• spring-boot:build-imageื™ืขื“ (Maven) ื•ื”ืชืงื ื” ืžืงื•ืžื™ืช ืฉืœ Docker.

ืื ื• ื™ื›ื•ืœื™ื ืœื”ืชืื™ื ืื™ืฉื™ืช ืืช ืฉื ื”ืชืžื•ื ื” ืฉืื ื• ืฆืจื™ื›ื™ื ืœื“ื—ื•ืฃ ืœ-Docker Registry ืขืœ ื™ื“ื™ ืฆื™ื•ืŸ ื”ืฉื 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>

ื‘ื•ืื• ื ืฉืชืžืฉ ื‘-Maven ืœื‘ื™ืฆื•ืข build-imageืžื˜ืจื•ืช ืœื™ืฆื™ืจืช ืืคืœื™ืงืฆื™ื” ื•ื™ืฆื™ืจืช ืชืžื•ื ืช ืžื™ื›ืœ. ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื›ืจื’ืข ื‘ืฉื•ื Dockerfiles.

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 ืขืœ ื™ื“ื™ ื”ืคืขืœืช ื”ืคืงื•ื“ื”:

docker images 

ืžืกืงื ื”:

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

ื™ืฆื™ืจืช ืชืžื•ื ืช ืžื™ื›ืœ ืขื Jib

Jib ื”ื•ื ืชื•ืกืฃ ืœื™ืฆื™ืจืช ืชืžื•ื ื•ืช ืžื’ื•ื’ืœ ื”ืžืกืคืง ืฉื™ื˜ื” ื—ืœื•ืคื™ืช ืœื™ืฆื™ืจืช ืชืžื•ื ืช ืžื™ื›ืœ ืžื”ืžืงื•ืจ.

ื”ื’ื“ืจืช ืชืฆื•ืจื” jib-maven-pluginื‘-pom.xml:

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

ืœืื—ืจ ืžื›ืŸ, ืื ื• ืžืคืขื™ืœื™ื ืืช ื”ืคืœืื’ื™ืŸ Jib ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” Maven ื›ื“ื™ ืœื‘ื ื•ืช ืืช ื”ืืคืœื™ืงืฆื™ื” ื•ืœื™ืฆื•ืจ ืืช ืชืžื•ื ืช ื”ืžื™ื›ืœ. ื›ืžื• ืงื•ื“ื, ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื‘-Dockerfiles ื›ืืŸ:

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.
  • ืื‘ื˜ื—ื”: ืœืชืžื•ื ื•ืช ื’ื“ื•ืœื•ืช ื™ืฉ ื’ื ืฉื˜ื— ื’ื“ื•ืœ ืœืคื’ื™ืขื•ืช.

ืชืžื•ื ืช Docker ืžื•ืจื›ื‘ืช ืžืขืจื™ืžื” ืฉืœ ืฉื›ื‘ื•ืช, ืฉื›ืœ ืื—ืช ืžื”ืŸ ืžื™ื™ืฆื’ืช ื”ืฆื”ืจื” ื‘-Dockerfile ืฉืœื ื•. ื›ืœ ืฉื›ื‘ื” ืžื™ื™ืฆื’ืช ืืช ื”ื“ืœืชื ืฉืœ ื”ืฉื™ื ื•ื™ื™ื ื‘ืฉื›ื‘ื” ื”ื‘ืกื™ืกื™ืช. ื›ืืฉืจ ืื ื• ืฉื•ืœืคื™ื ืชืžื•ื ืช Docker ืžื”ืจื™ืฉื•ื, ื”ื™ื ื ืžืฉื›ืช ื‘ืฉื›ื‘ื•ืช ื•ื ืฉืžืจืช ื‘ืžื˜ืžื•ืŸ ื‘ืžืืจื—.

Spring Boot ืฉื™ืžื•ืฉื™ื "Fat JAR" ื‘ ื›ืคื•ืจืžื˜ ื”ืืจื™ื–ื” ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ. ื›ืืฉืจ ืื ื• ืžืกืชื›ืœื™ื ืขืœ JAR ืฉืžืŸ, ืื ื• ืจื•ืื™ื ืฉื”ืืคืœื™ืงืฆื™ื” ื”ื™ื ื—ืœืง ืงื˜ืŸ ืžืื•ื“ ืžื›ืœ ื”-JAR. ื–ื” ื”ื—ืœืง ืฉื”ื›ื™ ืžืฉืชื ื”. ื”ืฉืืจ ืžื•ืจื›ื‘ ืžืชืœื•ืช ืฉืœ Spring Framework.

ื ื•ืกื—ืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืžืชืžืงื“ืช ื‘ื‘ื™ื“ื•ื“ ื”ืืคืœื™ืงืฆื™ื” ื‘ืจืžื” ื ืคืจื“ืช ืžื”ืชืœื•ืช ืฉืœ Spring Framework.

ืฉื›ื‘ืช ื”ืชืœื•ืช ืฉืžื”ื•ื•ื” ืืช ื”ื—ืœืง ื”ืืจื™ ืฉืœ ืงื•ื‘ืฅ ื”-JAR ื”ืขื‘ื” ื™ื•ืจื“ืช ืคืขื ืื—ืช ื‘ืœื‘ื“ ื•ื ืฉืžืจืช ื‘ืžื˜ืžื•ืŸ ื‘ืžืขืจื›ืช ื”ืžืืจื—ืช.

ืจืง ืฉื›ื‘ื” ื“ืงื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื ืžืฉื›ืช ื‘ืžื”ืœืš ืขื“ื›ื•ื ื™ ืืคืœื™ืงืฆื™ื” ื•ืชื–ืžื•ืŸ ืžื™ื›ืœ, ื›ืคื™ ืฉืžื•ืฆื’ ื‘ืชืจืฉื™ื ื–ื”:

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ื‘ืกืขื™ืคื™ื ื”ื‘ืื™ื, ื ื‘ื—ืŸ ื›ื™ืฆื“ ืœื™ืฆื•ืจ ืชืžื•ื ื•ืช ืื•ืคื˜ื™ืžืœื™ื•ืช ืืœื” ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot.

ื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ืื•ืคื˜ื™ืžืœื™ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot ืขื Buildpack

Spring Boot 2.3 ืชื•ืžืš ื‘ืฉื›ื‘ื•ืช ืขืœ ื™ื“ื™ ื—ื™ืœื•ืฅ ื—ืœืงื™ื ืžืงื•ื‘ืฅ JAR ืขื‘ื” ืœืฉื›ื‘ื•ืช ื ืคืจื“ื•ืช. ืชื›ื•ื ืช ื”ืฉื›ื‘ื•ืช ืžื•ืฉื‘ืชืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžื•ืคืขืœืช ื‘ืžืคื•ืจืฉ ื‘ืืžืฆืขื•ืช ื”ืคืœืื’ื™ืŸ Spring Boot Maven:

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

ืื ื• ื ืฉืชืžืฉ ื‘ืชืฆื•ืจื” ื–ื• ื›ื“ื™ ืœื‘ื ื•ืช ืืช ืชืžื•ื ืช ื”ืžื›ื•ืœื” ืฉืœื ื• ืชื—ื™ืœื” ืขื Buildpack ื•ืœืื—ืจ ืžื›ืŸ ืขื Docker ื‘ืกืขื™ืคื™ื ื”ื‘ืื™ื.

ื‘ื•ื ื ืจื•ืฅ build-imageืžื™ื™ื‘ืŸ ืžื˜ืจื” ืœื™ืฆื•ืจ ืชืžื•ื ืช ืžื™ื›ืœ:

mvn spring-boot:build-image

ืื ื ืจื™ืฅ ืืช Dive ื›ื“ื™ ืœืจืื•ืช ืืช ื”ืฉื›ื‘ื•ืช ื‘ืชืžื•ื ื” ื”ืžืชืงื‘ืœืช, ื ื•ื›ืœ ืœืจืื•ืช ืฉืฉื›ื‘ืช ื”ืืคืœื™ืงืฆื™ื” (ืžื•ืงืคืช ื‘ืื“ื•ื) ืงื˜ื ื” ื‘ื”ืจื‘ื” ื‘ื˜ื•ื•ื— ื”ืงื™ืœื•-ื‘ื™ื™ื˜ ื‘ื”ืฉื•ื•ืื” ืœืžื” ืฉืงื™ื‘ืœื ื• ื‘ืคื•ืจืžื˜ JAR ื”ืขื‘ื”:

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ืื•ืคื˜ื™ืžืœื™ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot ืขื Docker

ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ืชื•ืกืฃ Maven ืื• Gradle, ื ื•ื›ืœ ื’ื ืœื™ืฆื•ืจ ืชืžื•ื ืช Docker JAR ืฉื›ื‘ืชื™ืช ืขื ืงื•ื‘ืฅ Docker.

ื›ืืฉืจ ืื ื• ืžืฉืชืžืฉื™ื ื‘-Docker, ืขืœื™ื ื• ืœื ืงื•ื˜ ื‘ืฉื ื™ ืฉืœื‘ื™ื ื ื•ืกืคื™ื ื›ื“ื™ ืœื—ืœืฅ ืืช ื”ืฉื›ื‘ื•ืช ื•ืœื”ืขืชื™ืง ืื•ืชืŸ ืœืชืžื•ื ื” ื”ืกื•ืคื™ืช.

ื”ืชื•ื›ืŸ ืฉืœ ื”-JAR ืฉื ื•ืฆืจ ืœืื—ืจ ื‘ื ื™ื™ื” ืขื Maven ืขื ืฉื›ื‘ื•ืช ืžื•ืคืขืœืช ื™ื™ืจืื” ื›ืš:

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-layertoolsJAR ื‘ืžืงื•ื ื™ื™ืฉื•ื:

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ื”ืงื•ื‘ืฅ ื‘ืกื“ืจ ืฉื‘ื• ื™ืฉ ืœื”ื•ืกื™ืฃ ืื•ืชื ืœืชืžื•ื ืช Docker. ืฉื›ื‘ื•ืช ืืœื• ื ืฉืžืจื•ืช ื‘ืžื˜ืžื•ืŸ ื‘ืžืืจื— ืœืื—ืจ ื”ืื—ื–ื•ืจ ื”ืจืืฉื•ืŸ ืžื›ื™ื•ื•ืŸ ืฉื”ืŸ ืื™ื ืŸ ืžืฉืชื ื•ืช. ืจืง ืฉื›ื‘ืช ื”ืืคืœื™ืงืฆื™ื” ื”ืžืขื•ื“ื›ื ืช ื™ื•ืจื“ืช ืœืžืืจื—, ืฉื”ื™ื ืžื”ื™ืจื” ื™ื•ืชืจ ื‘ื’ืœืœ ื”ื’ื•ื“ืœ ื”ืžื•ืคื—ืช .

ื‘ื ื™ื™ืช ืชืžื•ื ื” ืขื ืชืœื•ืช ืฉื—ื•ืœืฆื” ืœืฉื›ื‘ื•ืช ื ืคืจื“ื•ืช

ื ื‘ื ื” ืืช ื”ืชืžื•ื ื” ื”ืกื•ืคื™ืช ื‘ืฉื ื™ ืฉืœื‘ื™ื ื‘ืืžืฆืขื•ืช ืฉื™ื˜ื” ืฉื ืงืจืืช ื”ืจื›ื‘ื” ืจื‘-ืฉืœื‘ื™ืช . ื‘ืฉืœื‘ ื”ืจืืฉื•ืŸ ื ื—ืœืฅ ืืช ื”ืชืœื•ืช ื•ื‘ืฉืœื‘ ื”ืฉื ื™ ื ืขืชื™ืง ืืช ื”ืชืœื•ืช ืฉื—ื•ืœืฆื• ืœื’ืžืจ.

ื‘ื•ืื• ื ืฉื ื” ืืช Dockerfile ืฉืœื ื• ืœื‘ื ื™ื™ื” ืžืจื•ื‘ื” ืฉืœื‘ื™ื:

# 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 ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื”:

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

ืื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช ืฉืชืžื•ื ืช Docker ื ื•ืฆืจืช ืขื ืžื–ื”ื” ืชืžื•ื ื” ื•ืœืื—ืจ ืžื›ืŸ ืžืชื•ื™ื’ืช.

ืœื‘ืกื•ืฃ, ืื ื• ืžืคืขื™ืœื™ื ืืช ืคืงื•ื“ืช ื”ืฆืœื™ืœื” ื›ืžื• ืงื•ื“ื ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื”ืฉื›ื‘ื•ืช ื‘ืชื•ืš ืชืžื•ื ืช Docker ืฉื ื•ืฆืจื”. ืื ื• ื™ื›ื•ืœื™ื ืœืกืคืง ืžื–ื”ื” ืชืžื•ื ื” ืื• ืชื’ ื›ืงืœื˜ ืœืคืงื•ื“ืช ื”ืฆืœื™ืœื”:

dive userssignup:v1

ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ืžื”ืคืœื˜, ื”ืฉื›ื‘ื” ื”ืžื›ื™ืœื” ืืช ื”ืืคืœื™ืงืฆื™ื” ื”ื™ื ื›ืขืช ืจืง 11 KB ื•ื”ืชืœื•ืช ื ืฉืžืจื•ืช ื‘ืฉื›ื‘ื•ืช ื ืคืจื“ื•ืช. 

ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker ืื•ืคื˜ื™ืžืœื™ื•ืช ืขื‘ื•ืจ ื™ื™ืฉื•ื Spring Boot

ื—ื™ืœื•ืฅ ืชืœื•ืช ืคื ื™ืžื™ืช ื‘ืฉื›ื‘ื•ืช ื ืคืจื“ื•ืช

ืื ื• ื™ื›ื•ืœื™ื ืœื”ืงื˜ื™ืŸ ืขื•ื“ ื™ื•ืชืจ ืืช ื’ื•ื“ืœ ืฉื›ื‘ืช ื”ื™ื™ืฉื•ื ืขืœ ื™ื“ื™ ื—ื™ืœื•ืฅ ื›ืœ ืื—ืช ืžื”ืชืœื•ืช ื”ืžื•ืชืืžื•ืช ืื™ืฉื™ืช ืฉืœื ื• ืœืฉื›ื‘ื” ื ืคืจื“ืช ื‘ืžืงื•ื ืœืืจื•ื– ืื•ืชืŸ ืขื ื”ื™ื™ืฉื•ื ืขืœ ื™ื“ื™ ื”ืฆื”ืจืชืŸ ื‘ 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 ืœื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ื™ืฉื™ืจื•ืช ืžื”ืžืงื•ืจ. ื–ื•ื”ื™ ืืœื˜ืจื ื˜ื™ื‘ื” ืœืฉื™ืžื•ืฉ ื‘-Docker ืœื™ืฆื™ืจืช ืชืžื•ื ืช ืงื•ื ื˜ื™ื™ื ืจ ื‘ื“ืจืš ื”ืจื’ื™ืœื”: ืจืืฉื™ืช, ื ื•ืฆืจ ืงื•ื‘ืฅ JAR ื‘ืจ ื”ืคืขืœื” ืขื‘ื” ื•ืœืื—ืจ ืžื›ืŸ ื ืืจื– ืœืชื•ืš ืชืžื•ื ืช ืงื•ื ื˜ื™ื™ื ืจ ืขืœ ื™ื“ื™ ืฆื™ื•ืŸ ื”ื”ื•ืจืื•ืช ื‘-Dockerfile.

ื‘ื“ืงื ื• ื’ื ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื”ืžื™ื›ืœ ืฉืœื ื• ืขืœ ื™ื“ื™ ื”ื›ืœืœืช ืชื›ื•ื ืช ืฉื›ื‘ื•ืช ื”ืžื—ืœืฆืช ืชืœื•ืช ืœืฉื›ื‘ื•ืช ื ืคืจื“ื•ืช ืฉืžืื•ื—ืกื ื•ืช ื‘ืžื˜ืžื•ืŸ ื‘ืžืืจื— ื•ืฉื›ื‘ืช ืืคืœื™ืงืฆื™ื” ื“ืงื” ื ื˜ืขื ืช ื‘ื–ืžืŸ ื”ืชื–ืžื•ืŸ ื‘ืžื ื•ืขื™ ื”ื‘ื™ืฆื•ืข ืฉืœ ื”ืžื›ื•ืœื”.

ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ืืช ื›ืœ ืงื•ื“ ื”ืžืงื•ืจ ื”ืžืฉืžืฉ ื‘ืžืืžืจ ื‘ื›ืชื•ื‘ืช GitHub .

ื”ืคื ื™ื” ืœืคืงื•ื“ื”

ืœื”ืœืŸ ืกื™ื›ื•ื ืฉืœ ื”ืคืงื•ื“ื•ืช ื‘ื”ืŸ ื”ืฉืชืžืฉื ื• ื‘ืžืืžืจ ื–ื” ืœืขื™ื•ืŸ ืžื”ื™ืจ.

ื ื™ืงื•ื™ ื”ืงืฉืจ:

docker system prune -a

ื‘ื ื™ื™ืช ืชืžื•ื ืช ืžื™ื›ืœ ืขื Dockerfile:

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

ื‘ื ื” ืชืžื•ื ืช ืžื™ื›ืœ ืžืžืงื•ืจ (ืœืœื Dockerfile):

mvn spring-boot:build-image

ื”ืฆื’ ืฉื›ื‘ื•ืช ืชืœื•ืช. ืœืคื ื™ ื‘ื ื™ื™ืช ืงื•ื‘ืฅ ืฆื ืฆื ืช ื”ื™ื™ืฉื•ื, ื•ื“ื ืฉืชื›ื•ื ืช ื”ืฉื›ื‘ื•ืช ืžื•ืคืขืœืช ื‘ืชื•ืกืฃ spring-boot-maven-:

java -Djarmode=layertools -jar application.jar list

ื—ืœืฅ ืฉื›ื‘ื•ืช ืชืœื•ืช. ืœืคื ื™ ื‘ื ื™ื™ืช ืงื•ื‘ืฅ ืฆื ืฆื ืช ื”ื™ื™ืฉื•ื, ื•ื“ื ืฉืชื›ื•ื ืช ื”ืฉื›ื‘ื•ืช ืžื•ืคืขืœืช ื‘ืชื•ืกืฃ spring-boot-maven-:

 java -Djarmode=layertools -jar application.jar extract

ื”ืฆื’ืช ืจืฉื™ืžื” ืฉืœ ืชืžื•ื ื•ืช ืžื™ื›ืœ

docker images

ื”ืฆื’ ืžืฉืžืืœ ื‘ืชื•ืš ืชืžื•ื ืช ื”ืžื™ื›ืœ (ื•ื“ื ืฉื›ืœื™ ื”ืฆืœื™ืœื” ืžื•ืชืงืŸ):

dive <image ID or image tag>

ืžืงื•ืจ: www.habr.com