БъздаванС Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker ΠΎΠ±Ρ€Π°Π·ΠΈ Π·Π° Spring Boot ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅ станаха ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ срСдство Π·Π° ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° прилоТСния с всички софтуСрни зависимости ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π° систСма ΠΈ слСд Ρ‚ΠΎΠ²Π° сС доставят Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ срСди.

Π’ Ρ‚Π°Π·ΠΈ статия сС Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Spring Boot прилоТСния:

  • създаванС Π½Π° Docker ΠΎΠ±Ρ€Π°Π· Ρ‡Ρ€Π΅Π· Docker Ρ„Π°ΠΉΠ»,
  • създаванС Π½Π° OCI ΠΎΠ±Ρ€Π°Π· ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Cloud-Native Buildpack,
  • ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‡Ρ€Π΅Π· раздСлянС Π½Π° части ΠΎΡ‚ JAR Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π° с многослойни инструмСнти.

Β ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΊΠΎΠ΄

Π’Π°Π·ΠΈ статия Π΅ ΠΏΡ€ΠΈΠ΄Ρ€ΡƒΠΆΠ΅Π½Π° ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΊΠΎΠ΄Β Π² GitHubΒ .

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

Π—Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ с тСрминологията Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² статията:

  • ΠžΠ±Ρ€Π°Π· Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (Container image): Ρ„Π°ΠΉΠ» с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ΠŸΡ€Π΅Π²Ρ€ΡŠΡ‰Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ си Π² ΠΎΠ±Ρ€Π°Π· Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠ°Ρ‚ΠΎ стартирамС инструмСнта Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚: изпълним СкзСмпляр Π½Π° ΠΎΠ±Ρ€Π°Π·Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π» Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Container engine): Π΄Π΅ΠΌΠΎΠ½ процСс, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° стартиранСто Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π₯ост Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Container host): хост ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡŠΡ‚ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ (Container registry): ΠΎΠ±Ρ‰ΠΎ мСстополоТСниС, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ ΠΈ разпространСниС Π½Π° ΠΎΠ±Ρ€Π°Π·Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ OCI:Β Open 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 с зависимости web,Β lombokΠΈΒ actuator. ДобавямС ΡΡŠΡ‰ΠΎ REST ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€, Π·Π° Π΄Π° прСдоставим API ΡΒ Π˜Π—Π˜Π‘ΠšΠ’ΠΠΠ•ΠΌΠ΅Ρ‚ΠΎΠ΄.

БъздаванС Π½Π° Docker Ρ„Π°ΠΉΠ»

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° поставямС Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, добавяйки Dockerfile:

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=targetonts/**/*.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 ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΠΈΠΌΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° ΠΎΠ±Π»Π°Ρ‡Π½ΠΈΡ‚Π΅ Buildpacks

Π•Π΄Π½ΠΎ ΠΎΡ‚ основнитС прСдимства Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° 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:

org.springframework.boot
  spring-boot-maven-plugin
  
    
      docker.io/pratikdas/${project.artifactId}:v1

НСка Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Maven, Π·Π° Π΄Π° изпълним build-imageΡ†Π΅Π»Ρ‚Π° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ създаванС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Docker Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

mvn spring-boot:build-image

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Π°ΠΊΠ°:

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ usersignup ---
[INFO] Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 'docker.io/pratikdas/usersignup:v1'
[INFO] 
[INFO]  > Π˜Π·Ρ‚Π΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ builder 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
.
.
.. [creator]     ДобавянС Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ 'org.springframework.boot.version'
.. [creator]     *** Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ (c311fe74ec73):
.. [creator]           docker.io/pratikdas/usersignup:v1
[INFO] 
[INFO] УспСшно ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ '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:

      com.google.cloud.tools
        jib-maven-plugin
        2.5.2

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° стартирамС ΠΏΠ»Π°Π³ΠΈΠ½Π° Jib с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Maven, Π·Π° Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ създадСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠšΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΠΈ, Ρ‚ΡƒΠΊ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Docker Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅:

mvn compile jib:build -Dimage=/usersignup:v1

Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Maven ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ слСдния ΠΈΠ·Ρ…ΠΎΠ΄:

[INFO] ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ прилоТСния Π² pratikdas/usersignup:v1...
.
.
[INFO] Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° установлСна Π½Π° [java, -cp, /app/resources:/app/classes:/app/libs/*, io.pratik.users.UsersignupApplication]
[INFO] 
[INFO] ΠžΠ±Ρ€Π°Π· построСн ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΊΠ°ΠΊ pratikdas/usersignup:v1
[INFO] Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡:
[INFO] [==============================] 100.0% Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ

Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚, Ρ‡Π΅ ΠΎΠ±Ρ€Π°Π·ΡŠΡ‚ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π΅ създадСн ΠΈ поставСн Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°.

ΠœΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° оптимизация Π½Π° изобраТСния

ИмамС Π΄Π²Π΅ основни ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° оптимизация:

  • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚: Π² систСмата Π·Π° оркСстрация Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, ΠΎΠ±Ρ€Π°Π·ΡŠΡ‚ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° сС ΠΈΠ·Π²Π»ΠΈΡ‡Π° ΠΎΡ‚ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° хоста, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΅ стартиран ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’ΠΎΠ·ΠΈ процСс сС Π½Π°Ρ€ΠΈΡ‡Π° ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π΅. Π˜Π·Π²Π»ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Ρ€Π°Π·ΠΈ ΠΎΡ‚ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ дълго Π²Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π΅ Π² систСмитС Π·Π° оркСстрация Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈ дълго Π²Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π² 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 ΠΏΠ»Π°Π³ΠΈΠ½:

org.springframework.boot
  spring-boot-maven-plugin
  
    
      true

НиС Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ конфигурация, Π·Π° Π΄Π° създадСм нашия ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ ΠΎΠ±Ρ€Π°Π· ΠΏΡŠΡ€Π²ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Buildpack, Π° слСд Ρ‚ΠΎΠ²Π° ΠΈ с Docker Π² слСдващитС сСкции.

НСка стартирамС build-imageMaven Ρ†Π΅Π» Π·Π° създаванС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ ΠΎΠ±Ρ€Π°Π·:

mvn spring-boot:build-image

Ако стартирамС Dive, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ слоСвСтС Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Π΅ ΡΠ»ΠΎΠΉΡŠΡ‚ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ (ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ с Ρ‡Π΅Ρ€Π²Π΅Π½ΠΎ) Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-малък Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ΠΈ Π² сравнСниС с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ дСбСлия Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JAR:

БъздаванС Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker ΠΎΠ±Ρ€Π°Π·ΠΈ Π·Π° Spring Boot ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

БъздаванС Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ ΠΎΠ±Ρ€Π°Π· Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Spring Boot с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Docker

ВмСсто Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Maven ΠΈΠ»ΠΈ Gradle плъгин, Π½ΠΈΠ΅ ΡΡŠΡ‰ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° създадСм ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π² JAR Docker ΠΎΠ±Ρ€Π°Π· с Dockerfile.

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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

Π˜Π·Ρ…ΠΎΠ΄ΡŠΡ‚ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅Β ΡΠΏΠΈΡΡŠΠΊ,Β extractΠΈΒ helpс helpΠ΄Π° бъдС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. НСка стартирамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΡΒ ΡΠΏΠΈΡΡŠΠΊΠΎΠΏΡ†ΠΈΡΡ‚Π°:

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 .

Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ слСдния ΠΈΠ·Ρ…ΠΎΠ΄:

Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ към Docker Π΄Π΅ΠΌΠΎΠ½  20.41MB
Π‘Ρ‚ΡŠΠΏΠΊΠ° 1/12 : ОВ adoptopenjdk:14-jre-hotspot ΠΊΠ°Ρ‚ΠΎ builder
14-jre-hotspot: Π˜Π·Ρ‚Π΅Π³Π»ΡΠ½Π΅ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°/adoptopenjdk
.
.
УспСшно ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° a9ebf6970841
УспСшно Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π° 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  -t  .

БглобяванС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ ΠΎΠ±Ρ€Π°Π· ΠΎΡ‚ изходния ΠΊΠΎΠ΄ (Π±Π΅Π· 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

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster