Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker для прилоТСния Spring Boot

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ стали ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ срСдством ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ прилоТСния со всСми зависимостями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π° Π·Π°Ρ‚Π΅ΠΌ доставки ΠΈΡ… Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ срСды.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния Spring Boot:

  • созданиС ΠΎΠ±Ρ€Π°Π·Π° Docker с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° Docker,
  • созданиС ΠΎΠ±Ρ€Π°Π·Π° OCI ΠΈΠ· исходного ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Cloud-Native Buildpack,
  • ΠΈ оптимизация изобраТСния Π²ΠΎ врСмя выполнСния ΠΏΡƒΡ‚Π΅ΠΌ раздСлСния частСй JAR Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… инструмСнтов.

 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ сопровоТдаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° GitHub .

ВСрминология ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅:

  • ΠžΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Container image): Ρ„Π°ΠΉΠ» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. ΠœΡ‹ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, запустив инструмСнт сборки.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€: исполняСмый экзСмпляр ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π”Π²ΠΈΠΆΠΎΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Container engine): процСсс-Π΄Π΅ΠΌΠΎΠ½, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° запуск ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π₯ост ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Container host): хост-ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • РССстр ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (Container registry): ΠΎΠ±Ρ‰Π΅Π΅ располоТСниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ распространСния ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ OCIOpen Container Initiative (OCI) — это облСгчСнная открытая структура управлСния, сформированная Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Linux Foundation. БпСцификация ΠΎΠ±Ρ€Π°Π·ΠΎΠ² OCI опрСдСляСт отраслСвыС стандарты для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ срСды выполнСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², созданныС Π»ΡŽΠ±Ρ‹ΠΌ инструмСнтом сборки.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ этот ΠΎΠ±Ρ€Π°Π· Π² ΠΎΠ±Ρ‰ΠΈΠΉ рССстр. Π‘Ρ€Π΅Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ этот ΠΎΠ±Ρ€Π°Π· ΠΈΠ· рССстра, распаковываСт Π΅Π³ΠΎ ΠΈ запускаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ.

ВСрсия 2.3 Spring Boot прСдоставляСт ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для создания ΠΎΠ±Ρ€Π°Π·ΠΎΠ² OCI.

Docker — Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ рСализация ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Docker Π² Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, поэтому всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ссылки Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Docker.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ способом

Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ Docker для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Spring Boot ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² нСсколько инструкций Π² Ρ„Π°ΠΉΠ» Docker.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создаСм исполняСмый Ρ„Π°ΠΉΠ» JAR ΠΈ, ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ инструкций Ρ„Π°ΠΉΠ»Π° Docker, ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ исполняСмый Ρ„Π°ΠΉΠ» JAR ΠΏΠΎΠ²Π΅Ρ€Ρ… Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° JRE послС примСнСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… настроСк.

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Spring Π½Π° Spring Initializr Ρ зависимостями weblombokΠΈ actuator. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ добавляСм rest ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ API с GETΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Docker

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, добавляя Dockerfile:

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

Наш Ρ„Π°ΠΉΠ» Docker содСрТит Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, ΠΈΠ· adoptopenjdk, ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ наш Ρ„Π°ΠΉΠ» JAR, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚, 8080ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚ΡŒ запросы.

Π‘Π±ΠΎΡ€ΠΊΠ° прилоТСния

Π‘Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Maven ΠΈΠ»ΠΈ Gradle. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Maven:

mvn clean package

Π­Ρ‚ΠΎ создаСт исполняСмый JAR-Ρ„Π°ΠΉΠ» прилоТСния. ΠΠ°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ этот исполняСмый JAR Π² ΠΎΠ±Ρ€Π°Π· Docker для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π΄Π²ΠΈΠΆΠΊΠ΅ Docker.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ этот исполняСмый Ρ„Π°ΠΉΠ» JAR Π² ΠΎΠ±Ρ€Π°Π· Docker, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ docker buildΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, содСрТащСго Ρ„Π°ΠΉΠ» Docker, созданный Ρ€Π°Π½Π΅Π΅:

docker build  -t usersignup:v1 .

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ нашС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² спискС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

docker images 

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя наш ΠΎΠ±Ρ€Π°Π· usersignupвмСстС с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, adoptopenjdk, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² нашСм Ρ„Π°ΠΉΠ»Π΅ Docker.

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

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ слоСв Π²Π½ΡƒΡ‚Ρ€ΠΈ изобраТСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° стопку слоСв Π²Π½ΡƒΡ‚Ρ€ΠΈ изобраТСния. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚  dive, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ эти слои:

dive usersignup:v1

Π’ΠΎΡ‚ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Dive: 

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker для прилоТСния Spring Boot

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ составляСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° изобраТСния. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ этого слоя Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нашСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Buildpack

Π‘Π±ΠΎΡ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ (Buildpacks) — это ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ прСдлоТСниями Β«ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ°ΠΊ услуга» (PAAS) для создания ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ· исходного ΠΊΠΎΠ΄Π°. ΠžΠ½ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ Heroku Π² 2011 Π³ΠΎΠ΄Ρƒ ΠΈ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π±Ρ‹Π» принят Cloud Foundry, Google App Engine, Gitlab, Knative ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker для прилоТСния Spring Boot

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… сборочных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

Одним ΠΈΠ· основных прСимущСств использования Buildpack для создания ΠΎΠ±Ρ€Π°Π·ΠΎΠ² являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ (builder) ΠΈ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π° всС прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ builder.

Π‘Π±ΠΎΡ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ тСсно связаны с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ. Cloud-Native Buildpacks ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, поддСрТивая Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΠ±Ρ€Π°Π·Π° OCI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π· ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π΄Π²ΠΈΠΆΠΊΠΎΠΌ Docker.

ИспользованиС плагина Spring Boot

Плагин Spring Boot создаСт ΠΎΠ±Ρ€Π°Π·Ρ‹ OCI ΠΈΠ· исходного ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Buildpack. ΠžΠ±Ρ€Π°Π·Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с использованиСм bootBuildImageΠ·Π°Π΄Π°Ρ‡ΠΈ (Gradle) ΠΈΠ»ΠΈ spring-boot:build-imageΡ†Π΅Π»ΠΈ (Maven) ΠΈ локальной установки Docker.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ имя ΠΎΠ±Ρ€Π°Π·Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² рССстр Docker, ΡƒΠΊΠ°Π·Π°Π² имя Π² 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Ρ†Π΅Π»ΠΈ ΠΏΠΎ созданию прилоТСния ΠΈ созданию ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π‘Сйчас ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Docker.

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 — это ΠΏΠ»Π°Π³ΠΈΠ½ для создания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ‚ Google, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ создания ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ· исходного ΠΊΠΎΠ΄Π°.

НастраиваСм 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, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠšΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, здСсь ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Docker:

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 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Β«Ρ‚олстый 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Ρ†Π΅Π»ΡŒ Maven Π΄Π»Ρ создания ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

mvn spring-boot:build-image

Если ΠΌΡ‹ запустим Dive, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ слои Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ прилоТСния (ΠΎΠ±Π²Π΅Π΄Π΅Π½ красным) Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ с использованиСм толстого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° JAR:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker для прилоТСния Spring Boot

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° для прилоТСния Spring Boot с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Docker

ВмСсто использования ΠΏΠ»Π°Π³ΠΈΠ½Π° Maven ΠΈΠ»ΠΈ Gradle ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· JAR Docker с Ρ„Π°ΠΉΠ»ΠΎΠΌ 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. Π­Ρ‚ΠΈ слои ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² хостС послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ извлСчСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. ΠΠ° хост загруТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ прилоТСния, Ρ‡Ρ‚ΠΎ происходит быстрСС ΠΈΠ·-Π·Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° .

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° с зависимостями, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ слои

ΠœΡ‹ построим Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· Π² Π΄Π²Π° этапа, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Π°ΠΏΠ½ΠΎΠΉ сборкой . ΠΠ° ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ зависимости, Π° Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС ΠΌΡ‹ скопируСм ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹Π΅ зависимости Π² ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· .

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наш Ρ„Π°ΠΉΠ» Docker для многоэтапной сборки:

# 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 создаСтся с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ изобраТСния, Π° Π·Π°Ρ‚Π΅ΠΌ тСгируСтся.

НаконСц, ΠΌΡ‹ запускаСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Dive, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ слои Π²Π½ΡƒΡ‚Ρ€ΠΈ сгСнСрированного ΠΎΠ±Ρ€Π°Π·Π° Docker. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ изобраТСния ΠΈΠ»ΠΈ Ρ‚Π΅Π³ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Dive:

dive userssignup:v1

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, содСрТащий ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго 11 ΠšΠ‘, Π° зависимости ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… слоях. 

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² 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, Π° Π·Π°Ρ‚Π΅ΠΌ упаковываСтся Π΅Π³ΠΎ Π² ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΡƒΠΊΠ°Π·Π°Π² инструкции Π² Ρ„Π°ΠΉΠ»Π΅ Docker.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСли ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ нашСго ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ наслоСния, которая ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ зависимости Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° хостС, Π° Ρ‚ΠΎΠ½ΠΊΠΈΠΉ слой прилоТСния загруТаСтся Π²ΠΎ врСмя планирования Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… выполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ вСсь исходный ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° Github .

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΊΠΎΠΌΠ°Π½Π΄

Π’ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ использовали Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ для быстрого ознакомлСния.

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° контСкста:

docker system prune -a

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° Docker:

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

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ· исходного ΠΊΠΎΠ΄Π° (Π±Π΅Π· Dockerfile):

mvn spring-boot:build-image

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ слоСв зависимостСй. ΠŸΠ΅Ρ€Π΅Π΄ сборкой JAR-Ρ„Π°ΠΉΠ»Π° прилоТСния ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ функция наслоСния Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ слоСв зависимостСй. ΠŸΠ΅Ρ€Π΅Π΄ сборкой JAR-Ρ„Π°ΠΉΠ»Π° прилоТСния ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ функция наслоСния Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ списка ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²

docker images

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ слСв Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ установлСн инструмСнт для погруТСния):

dive <image ID or image tag>

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com