Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π½Π° Docker Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

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

Π’Π°Π·ΠΈ статия ΠΎΠ±Ρ…Π²Π°Ρ‰Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Spring Boot:

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

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

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

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Π° тСрминология

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

  • Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€: Ρ„Π°ΠΉΠ» със спСцифичСн Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠ°Ρ‚ΠΎ стартирамС инструмСнта Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅.
  • ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€: Изпълним СкзСмпляр Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»: ΠŸΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° Π΄Π΅ΠΌΠΎΠ½, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° стартиранСто Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ хост: Π₯ост ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π°, Π½Π° която Ρ€Π°Π±ΠΎΡ‚ΠΈ контСйнСрният Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π».
  • Π Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ: ΠžΠ±Ρ‰ΠΎΡ‚ΠΎ мСстополоТСниС, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ ΠΈ разпространСниС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • OCI ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π˜Π½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π° Π·Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ (OCI) Π΅ Π»Π΅ΠΊΠ° Ρ€Π°ΠΌΠΊΠ° Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, създадСна ΠΎΡ‚ Linux Foundation. БпСцификацията Π½Π° изобраТСния Π½Π° OCI опрСдСля индустриални стандарти Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ Π½Π° изобраТСния Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° изпълнСниС, Π·Π° Π΄Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ всички Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ изобраТСния Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, създадСни ΠΎΡ‚ всСки инструмСнт Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅.

Π—Π° Π΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΈΠ΅ ΠΎΠ±Π³Ρ€ΡŠΡ‰Π°ΠΌΠ΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² публичния Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€. Π‘Ρ€Π΅Π΄Π°Ρ‚Π° Π·Π° изпълнСниС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ систСмния Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€, Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π° Π³ΠΎ ΠΈ стартира ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² Π½Π΅Π³ΠΎ.

ВСрсия 2.3 Π½Π° Spring Boot прСдоставя Π΄ΠΎΠ±Π°Π²ΠΊΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° OCI изобраТСния.

Π΄ΠΎΠΊΠ΅Ρ€ Π΅ Π½Π°ΠΉ-чСсто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π°Ρ‚Π° рСализация Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Docker Π² Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всички послСдващи ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠΈ към ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ Π² Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ сС отнасят Π·Π° Docker.

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠΎ традиционния Π½Π°Ρ‡ΠΈΠ½

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker изобраТСния Π·Π° Spring Boot прилоТСния Π΅ ΠΌΠ½ΠΎΠ³ΠΎ лСсно Ρ‡Ρ€Π΅Π· добавянС Π½Π° няколко инструкции към вашия Dockerfile.

ΠŸΡŠΡ€Π²ΠΎ създавамС изпълним JAR ΠΈ, ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ инструкциитС Π½Π° Dockerfile, ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ изпълнимия JAR Π²ΡŠΡ€Ρ…Ρƒ основното JRE ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, слСд ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ пСрсонализации.

НСка създадСм Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Spring Π½Π° ΠŸΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΡΡŠΡ зависимости weblombokΠΈ actuator. НиС ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° добавямС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ Π·Π° ΠΏΠΎΡ‡ΠΈΠ²ΠΊΠ°, Π·Π° Π΄Π° прСдоставим 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"]

ΠΠ°ΡˆΠΈΡΡ‚ 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

Π•Ρ‚ΠΎ част ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Dive: 

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π½Π° Docker Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, прилоТният слой ΡΡŠΡΡ‚Π°Π²Π»ΡΠ²Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° част ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. ИскамС Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ слой Π² слСдващитС Ρ€Π°Π·Π΄Π΅Π»ΠΈ ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ Π½Π°ΡˆΠ°Ρ‚Π° оптимизация.

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с Buildpack

ΠœΠΎΠ½Ρ‚Π°ΠΆΠ½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ (Buildpacks) Π΅ ΠΎΠ±Ρ‰ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ прСдлоТСния Π·Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ°Ρ‚ΠΎ услуга (PAAS) Π·Π° създаванС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΡ‚ изходния ΠΊΠΎΠ΄. Π’ΠΎΠΉ бСшС пуснат ΠΎΡ‚ Heroku ΠΏΡ€Π΅Π· 2011 Π³. ΠΈ ΠΎΡ‚Ρ‚ΠΎΠ³Π°Π²Π° бСшС ΠΏΡ€ΠΈΠ΅Ρ‚ ΠΎΡ‚ Cloud Foundry, Google App Engine, Gitlab, Knative ΠΈ няколко Π΄Ρ€ΡƒΠ³ΠΈ.

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π½Π° Docker Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

ΠŸΡ€Π΅Π΄ΠΈΠΌΡΡ‚Π²ΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠ±Π»Π°ΠΊ

Π•Π΄Π½ΠΎ ΠΎΡ‚ основнитС прСдимства Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Buildpack Π·Π° създаванС Π½Π° изобраТСния Π΅ Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² конфигурацията Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС управляват Ρ†Π΅Π½Ρ‚Ρ€Π°Π»Π½ΠΎ (builder) ΠΈ Π΄Π° сС разпространяват Π΄ΠΎ всички прилоТСния, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ builder.

ΠŸΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ бяха тясно ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Cloud-Native Buildpacks осигуряват стандартизация ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ OCI Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС изпълнява ΠΎΡ‚ Docker двигатСля.

ИзползванС на Spring Boot Plugin

ΠŸΠ»ΡŠΠ³ΠΈΠ½ΡŠΡ‚ Spring Boot ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° OCI изобраТСния ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Buildpack. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡΡ‚Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° bootBuildImageΠ·Π°Π΄Π°Ρ‡ΠΈ (Gradle) ΠΈΠ»ΠΈ spring-boot:build-imagetarget (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Ρ†Π΅Π»ΠΈ Π·Π° създаванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ създаванС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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 Π΅ плъгин Π·Π° създаванС Π½Π° изобраТСния ΠΎΡ‚ 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, Π·Π° Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° създадСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠšΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΠΈ, Ρ‚ΡƒΠΊ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° "Π΄Π΅Π±Π΅Π» Π±ΡƒΡ€ΠΊΠ°Π½" Π² ΠΊΠ°Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° ΠΎΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°Ρ‚Π° ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π΄Π΅Π±Π΅Π» JAR, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠ° част ΠΎΡ‚ цСлия JAR. Π’ΠΎΠ²Π° Π΅ частта, която сС промСня Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ. ΠžΡΡ‚Π°Π½Π°Π»ΠΎΡ‚ΠΎ сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ зависимости Π½Π° Spring Framework.

Π€ΠΎΡ€ΠΌΡƒΠ»Π°Ρ‚Π° Π·Π° оптимизация Π΅ ΡΡŠΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡Π΅Π½Π° ΠΎΠΊΠΎΠ»ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ Π½ΠΈΠ²ΠΎ ΠΎΡ‚ зависимоститС Π½Π° Spring Framework.

Блоят Π½Π° зависимостта, ΠΊΠΎΠΉΡ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° ΠΏΠΎ-голямата част ΠΎΡ‚ дСбСлия JAR Ρ„Π°ΠΉΠ», сС изтСгля само вСднъТ ΠΈ сС ΠΊΠ΅ΡˆΠΈΡ€Π° Π² хост систСмата.

Π‘Π°ΠΌΠΎ Ρ‚ΡŠΠ½ΡŠΠΊ слой ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ сС изтСгля ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° прилоТСния ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°:

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π½Π° Docker Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

Π’ слСдващитС Ρ€Π°Π·Π΄Π΅Π»ΠΈ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ‚Π΅Π·ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° 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 Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ стартиращо ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Docker

ВмСсто Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ плъгин Maven ΠΈΠ»ΠΈ Gradle, ΠΌΠΎΠΆΠ΅ΠΌ ΡΡŠΡ‰ΠΎ Π΄Π° създадСм многослойно Docker JAR ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с 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

Π˜Π·Ρ…ΠΎΠ΄ΡŠΡ‚ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ 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 Π΅ създадСно с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΎ.

Накрая изпълнявамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Dive ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ, Π·Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ слоСвСтС Π²ΡŠΡ‚Ρ€Π΅ Π² Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ Docker ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. МоТСм Π΄Π° прСдоставим ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ ΠΊΠ°Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄ към ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Dive:

dive userssignup:v1

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π°, слоят, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, сСга Π΅ само 11 KB ΠΈ зависимоститС са ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ слоСвС. 

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ изобраТСния Π½Π° Docker Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

Π˜Π·Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ зависимости Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ слоСвС

МоТСм Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° слоя Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ всяка ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ пСрсонализирани зависимости Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ слой, вмСсто Π΄Π° Π³ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°ΠΌΠ΅ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠ°Ρ‚ΠΎ Π³ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ Π² 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

ΠŸΡ€Π΅Π³Π»Π΅Π΄ Π½Π° слоСвСтС Π½Π° зависимости. ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ 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>

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