БоздавањС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker слики Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ подигањС

ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ станаа Π½Π°Ρ˜ΠΏΠΎΡΠ°ΠΊΡƒΠ²Π°Π½ΠΎΡ‚ΠΎ срСдство Π·Π° ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° со ситС нСјзини зависности ΠΎΠ΄ софтвСрот ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм ΠΈ ΠΏΠΎΡ‚ΠΎΠ° Π½ΠΈΠ²Π½ΠΎ Π΄ΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ срСдини.

Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ΠΎΠΏΡ„Π°ΡœΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Spring Boot:

  • ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½Π° Docker слика со помош Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Docker,
  • создавањС Π½Π° OCI слика ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Cloud-Native Buildpack,
  • ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° сликата Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ со ΠΎΠ΄Π²ΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ JAR Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ слоСви ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π°Π»Π°Ρ‚ΠΊΠΈ со повСќС Π½ΠΈΠ²ΠΎΠ°.

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

Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π΅ ΠΏΡ€ΠΈΠ΄Ρ€ΡƒΠΆΠ΅Π½Π° со ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΊΠΎΠ΄ Π½Π° GitHub .

Π’Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ

ЌС Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ со Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π°Ρ‚Π° Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ ΡˆΡ‚ΠΎ сС користи Π²ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π°:

  • Π‘Π»ΠΈΠΊΠ° ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€: Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со спСцифичСн Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ЌС ја ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ со ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅.
  • ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€: Π˜Π·Π²Ρ€ΡˆΠ½Π° инстанца ΠΎΠ΄ сликата Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚.
  • ΠœΠΎΡ‚ΠΎΡ€ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€: ДСмонскиот процСс ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° водСњС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚.
  • Π”ΠΎΠΌΠ°ΡœΠΈΠ½ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€: Π”ΠΎΠΌΠ°ΡœΠΈΠ½ ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€ Π½Π° кој Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚.
  • РСгистар Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ: ΠžΠΏΡˆΡ‚Π°Ρ‚Π° Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ сС користи Π·Π° ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π° Π½Π° сликата Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚.
  • OCI ΡΡ‚Π°Π½Π΄Π°Ρ€Π΄Π˜Π½ΠΈΡ†ΠΈΡ˜Π°Ρ‚ΠΈΠ²Π° Π·Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ (OCI) Π΅ лСсна, ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π° структура Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π° Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π€ΠΎΠ½Π΄Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Linux. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° слика OCI Π³ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° индустрискитС стандарди Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ Π½Π° слики ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ ΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ‚Ρ€Π°Π΅ΡšΠ΅ Π·Π° Π΄Π° сС осигура Π΄Π΅ΠΊΠ° ситС ΠΌΠΎΡ‚ΠΎΡ€ΠΈ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ слики ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ создадСни ΠΎΠ΄ која Π±ΠΈΠ»ΠΎ Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅.

Π—Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ја ΠΎΠ±Π²ΠΈΡ‚ΠΊΡƒΠ²Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ ΠΈ ја ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΠΌΠ΅ Ρ‚Π°Π° слика Π²ΠΎ сподСлСн рСгистар. Π’Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚ ја ΠΏΡ€Π΅Π·Π΅ΠΌΠ° ΠΎΠ²Π°Π° слика ΠΎΠ΄ рСгистарот, ја ΠΎΡ‚ΠΏΠ°ΠΊΡƒΠ²Π° ΠΈ ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Π½Π΅Π³ΠΎ.

Π’Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° 2.3 Π½Π° Spring Boot ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ OCI слики.

ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ Π΅ Π½Π°Ρ˜Ρ‡Π΅ΡΡ‚ΠΎ користСната ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€, ΠΈ Π½ΠΈΠ΅ Π³ΠΎ користимС Docker Π²ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ситС послСдоватСлни Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС сС однСсуваат Π½Π° Docker.

Π˜Π·Π³Ρ€Π°Π΄Π±Π° Π½Π° слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ Π½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ Π½Π°Ρ‡ΠΈΠ½

Π‘ΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Docker слики Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅ Spring Boot Π΅ ΠΌΠ½ΠΎΠ³Ρƒ лСсно со додавањС Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ инструкции Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Docker.

ΠŸΡ€Π²ΠΎ создавамС ΠΈΠ·Π²Ρ€ΡˆΠ½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° JAR ΠΈ, ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ упатствата Π·Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Docker, ја ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ ΠΈΠ·Π²Ρ€ΡˆΠ½Π°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° 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"]

ΠΠ°ΡˆΠ°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Docker содрТи основна слика ΠΎΠ΄ adoptopenjdk, Π½Π°Π΄ кој ја ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° JAR Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ ΠΏΠΎΡ‚ΠΎΠ° ја ΠΎΡ‚Π²ΠΎΡ€Π°ΠΌΠ΅ ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π°, 8080ΠΊΠΎΠΈ ќС ΡΠ»ΡƒΡˆΠ°Π°Ρ‚ Π±Π°Ρ€Π°ΡšΠ°.

Π“Ρ€Π°Π΄Π΅ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°

ΠŸΡ€Π²ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Maven ΠΈΠ»ΠΈ Gradle. ОвдС користимС Maven:

mvn clean package

Ова создава ΠΈΠ·Π²Ρ€ΡˆΠ½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° JAR Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π’Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ овој ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ JAR Π²ΠΎ слика Π½Π° Docker Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Docker.

БоздавањС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€

ΠŸΠΎΡ‚ΠΎΠ° ја ставамС ΠΎΠ²Π°Π° ΠΈΠ·Π²Ρ€ΡˆΠ½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° JAR Π²ΠΎ сликата Π½Π° Docker со ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° docker buildΠΎΠ΄ root Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ Π³ΠΎ содрТи Dockerfile создадСн ΠΏΠΎΡ€Π°Π½ΠΎ:

docker build  -t usersignup:v1 .

МоТСмС Π΄Π° ја Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° слика Π²ΠΎ списокот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°:

docker images 

Π˜Π·Π»Π΅Π·ΠΎΡ‚ ΠΎΠ΄ Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ја Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° Π½Π°ΡˆΠ°Ρ‚Π° слика usersignupΠ·Π°Π΅Π΄Π½ΠΎ со основната слика, adoptopenjdkΠ½Π°Π²Π΅Π΄Π΅Π½ΠΎ Π²ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π”ΠΎΠΊΠ΅Ρ€.

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

ΠŸΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Π³ΠΈ слоСвитС Π²ΠΎ слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€

АјдС Π΄Π° Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΡƒΠΏΠΎΡ‚ слоСви Π²ΠΎ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚Π° Π½Π° сликата. НиС ќС користимС Π°Π»Π°Ρ‚ΠΊΠ°  Π½ΡƒΡ€Π½Π΅ Π·Π° Π΄Π° Π³ΠΈ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΠ²ΠΈΠ΅ слоСви:

dive usersignup:v1

Π•Π²Π΅ Π΄Π΅Π» ΠΎΠ΄ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Dive: 

БоздавањС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker слики Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ подигањС

Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅, ΡΠ»ΠΎΡ˜ΠΎΡ‚ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° сочинува Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π΅Π½ Π΄Π΅Π» ΠΎΠ΄ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° сликата. Π‘Π°ΠΊΠ°ΠΌΠ΅ Π΄Π° ја Π½Π°ΠΌΠ°Π»ΠΈΠΌΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° овој слој Π²ΠΎ слСднитС Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ Π½Π°ΡˆΠ°Ρ‚Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π°.

БоздавањС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Buildpack

ΠœΠΎΠ½Ρ‚Π°ΠΆΠ½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ (Buildpacks) Π΅ ΠΎΠΏΡˆΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΡˆΡ‚ΠΎ Π³ΠΎ користат Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ½ΡƒΠ΄ΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΊΠ°ΠΊΠΎ услуга (PAAS) Π·Π° Π΄Π° сС создадС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄. Вој бСшС лансиран ΠΎΠ΄ Π₯Π΅Ρ€ΠΎΠΊΡƒ Π²ΠΎ 2011 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΎΡ‚Ρ‚ΠΎΠ³Π°Ρˆ бСшС усвоСн ΠΎΠ΄ Cloud Foundry, Google App Engine, Gitlab, Knative ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈ.

БоздавањС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker слики Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ подигањС

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

Π•Π΄Π½Π° ΠΎΠ΄ Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈΠ²ΠΊΠΈ ΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Buildpack Π·Π° создавањС слики Π΅ Ρ‚ΠΎΠ° ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° сликата ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π°Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»Π½ΠΎ (Π³Ρ€Π°Π΄ΠΈΡ‚Π΅Π») ΠΈ Π΄Π° сС ΠΏΡ€ΠΎΠΏΠ°Π³ΠΈΡ€Π°Π°Ρ‚ Π½Π° ситС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ со помош Π½Π° Π±ΠΈΠ»Π΄Π΅Ρ€.

ΠŸΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π° Π±Π΅Π° цврсто ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. 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Ρ†Π΅Π»ΠΈ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ користимС Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ 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 Π·Π° Π΄Π° ја ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ Π΄Π° создадСмС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€. Како ΠΈ досСга, ΠΎΠ²Π΄Π΅ Π½Π΅ користимС Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π½Π° 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 ΠΎΠ΄ рСгистарот, Ρ‚Π°Π° сС Π²Π»Π΅Ρ‡Π΅ Π²ΠΎ слоСви ΠΈ сС ΠΊΠ΅ΡˆΠΈΡ€Π° Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚.

ΠšΠΎΡ€ΠΈΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ Ρ‡ΠΈΠ·ΠΌΠΈ β€žΠ΄Π΅Π±Π΅Π»Π° Ρ‚Π΅Π³Π»Π°β€œ Π²ΠΎ ΠΊΠ°ΠΊΠΎ стандардСн Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅. Кога ќС Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π΄Π΅Π±Π΅Π»ΠΈΠΎΡ‚ JAR, ќС Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° сочинува ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ°Π» Π΄Π΅Π» ΠΎΠ΄ Ρ†Π΅Π»ΠΈΠΎΡ‚ JAR. Ова Π΅ Π΄Π΅Π»ΠΎΡ‚ кој Π½Π°Ρ˜Ρ‡Π΅ΡΡ‚ΠΎ сС ΠΌΠ΅Π½ΡƒΠ²Π°. ΠžΡΡ‚Π°Ρ‚ΠΎΠΊΠΎΡ‚ сС состои ΠΎΠ΄ зависности ΠΎΠ΄ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½Π°Ρ‚Π° Ρ€Π°ΠΌΠΊΠ°.

Π€ΠΎΡ€ΠΌΡƒΠ»Π°Ρ‚Π° Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° сС фокусира Π½Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° посСбно Π½ΠΈΠ²ΠΎ ΠΎΠ΄ зависноститС ΠΎΠ΄ 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МСјвСн Ρ†Π΅Π» Π·Π° создавањС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€:

mvn spring-boot:build-image

Ако Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ Dive Π·Π° Π΄Π° Π³ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠ΅ слоСвитС Π½Π° Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° слика, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ»ΠΎΡ˜ΠΎΡ‚ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° (ΠΎΡ†Ρ€Ρ‚Π°Π½ со Ρ†Ρ€Π²Π΅Π½ΠΎ) Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠΌΠ°Π» Π²ΠΎ опсСгот Π½Π° ΠΊΠΈΠ»ΠΎΠ±Π°Ρ˜Ρ‚ΠΈ Π²ΠΎ спорСдба со ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ²ΠΌΠ΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ Π΄Π΅Π±Π΅Π»ΠΈΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JAR:

БоздавањС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Docker слики Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ подигањС

БоздавањС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π° слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ подигањС со помош Π½Π° 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

сСкоја зависност Ρ‡ΠΈΡ˜Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π΅ содрТи БНИМКА

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 Π΅ ΠΊΡ€Π΅ΠΈΡ€Π°Π½Π° со ID Π½Π° слика ΠΈ ΠΏΠΎΡ‚ΠΎΠ° Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π°.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Dive ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡ€Π°Π½ΠΎ Π·Π° Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ слоСвитС Π²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π°Ρ‚Π° слика Π½Π° Docker. МоТСмС Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ ID Π½Π° слика ΠΈΠ»ΠΈ ΠΎΠ·Π½Π°ΠΊΠ° ΠΊΠ°ΠΊΠΎ Π²Π»Π΅Π· Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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, Π° ΠΏΠΎΡ‚ΠΎΠ° ΡΠΏΠ°ΠΊΡƒΠ²Π°Ρ˜Ρ‚Π΅ ја Π²ΠΎ слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ со Π½Π°Π²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° инструкции Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Docker.

Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ со ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π·Π° слоСвитост ΡˆΡ‚ΠΎ Π³ΠΈ ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π° зависноститС Π²ΠΎ посСбни слоСви ΠΊΠΎΠΈ сС ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ ΠΈ Ρ‚Π΅Π½ΠΎΠΊ слој ΠΎΠ΄ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π° Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Π·Π°ΠΊΠ°ΠΆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ ΠΌΠΎΡ‚ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Ρ†Π΅Π»ΠΈΠΎΡ‚ ΠΈΠ·Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ користСн Π²ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π½Π° Github .

Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†Π° Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°

Π•Π²Π΅ Π±Ρ€Π· ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Π³ΠΈ користСвмС Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°.

Π Π°ΡΡ‡ΠΈΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° контСкстот:

docker system prune -a

БоздавањС слика Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Docker:

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

НиС ја Π³Ρ€Π°Π΄ΠΈΠΌΠ΅ сликата Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚ ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ (Π±Π΅Π· Dockerfile):

mvn spring-boot:build-image

ΠŸΡ€ΠΈΠΊΠ°ΠΆΠΈ Π³ΠΈ слоСвитС Π½Π° зависност. ΠŸΡ€Π΅Π΄ Π΄Π° ја ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° JAR Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° слоСвитост Π²ΠΎ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Ρ‚Π°-boot-maven-ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚:

java -Djarmode=layertools -jar application.jar list

Π˜Π·Π²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° слоСви Π½Π° зависност. ΠŸΡ€Π΅Π΄ Π΄Π° ја ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° JAR Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° слоСвитост Π²ΠΎ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Ρ‚Π°-boot-maven-ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚:

 java -Djarmode=layertools -jar application.jar extract

ΠŸΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ список со слики ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ

docker images

ΠŸΡ€ΠΈΠΊΠ°Π· Π½Π° Π»Π΅Π²Π°Ρ‚Π° страна Π²ΠΎ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚Π° Π½Π° сликата Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚ (ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ Π΅ инсталирана Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π·Π° Π½ΡƒΡ€ΠΊΠ°ΡšΠ΅):

dive <image ID or image tag>

Π˜Π·Π²ΠΎΡ€: www.habr.com