Buildpacks-Unterstützung in Spring Boot 2.3.0

Vor ein paar Tagen wurde Spring Boot 2.3.0.M1 veröffentlicht. In der Beschreibung wird die Unterstützung für das Cloud Native Buildpacks-Projekt erwähnt, mit dem versucht wird, das Leben der Entwickler zu vereinfachen und die automatisierteste Zusammenstellung von Images aus Quellcodes zu ermöglichen. Da unsere Microservices in meinem aktuellen Projekt in Containern leben müssen, habe ich mich entschlossen, es auszuprobieren und herauszufinden, was die Vorteile sind. Eine kurze Fortsetzung unter dem Schnitt.

Mit Cloud Native Buildpacks (CNB) kann der Entwickler keine eigene Docker-Datei schreiben oder unterstützen. Durch den Start des einzigen Teambuilding-Projekts für CNB wird festgelegt, welche Abhängigkeiten zu einem Image zusammengefügt werden sollen. Es sieht so aus:

Bild

Aufgrund verschiedener Technologien: OCI-Unterstützung, modularer Aufbau, Caching von Abhängigkeitsebenen - das CNB-System ist weit verbreitet und laut den Entwicklern recht schnell.

Lassen Sie uns überprüfen, was er tatsächlich ist. Laden Sie die Website start.spring.io leeres Projekt. Fügen Sie eine Prise Abhängigkeiten hinzu, um zu sehen, ob unser Container überhaupt funktioniert.

Hier endet die Vorbereitung für uns - unsere Bewerbung ist fertig zum Einfüllen in einen Container. Führen Sie dazu den Befehl gradle "./gradlew bootBuildImage" oder maven "./mvnw spring-boot: build-image" aus, und die Assembly wird gestartet . Nach der Montage erhalten wir ein Protokoll mit einer Beschreibung des gesamten Prozesses.

Das Plugin erhält zunächst die notwendigen Basis-Artefakte:

> Task :bootBuildImage Building image 'docker.io/library/cnb:0.0.1-SNAPSHOT' > Pulling builder image 'docker.io/cloudfoundry/cnb:0.0.43-bionic' .................................................. > Pulled builder image 'cloudfoundry/cnb@sha256:c983fb9602a7fb95b07d35ef432c04ad61ae8458263e7fb4ce62ca10de367c3b' > Pulling run image 'docker.io/cloudfoundry/run:base-cnb' .................................................. > Pulled run image 'cloudfoundry/run@sha256:ba9998ae4bb32ab43a7966c537aa1be153092ab0c7536eeef63bcd6336cbd0db' > Executing lifecycle version v0.5.0 > Using build cache volume 'pack-cache-7cfae5296b92.build' 

Es werden Detektoren gestartet, die das Projekt scannen und ermitteln, welche Abhängigkeiten zusätzlich erfasst werden sollen:

  > Running detector [detector] 6 of 13 buildpacks participating [detector] org.cloudfoundry.openjdk v1.0.80 [detector] org.cloudfoundry.jvmapplication v1.0.113 [detector] org.cloudfoundry.tomcat v1.1.74 [detector] org.cloudfoundry.springboot v1.0.157 [detector] org.cloudfoundry.distzip v1.0.144 [detector] org.cloudfoundry.springautoreconfiguration v1.0.159 

Abhängigkeiten werden heruntergeladen und die Assembly gestartet:

  > Running builder [builder] [builder] Cloud Foundry OpenJDK Buildpack v1.0.80 [builder] OpenJDK JRE 11.0.5: Contributing to layer [builder] Downloading from https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.5%2B10/OpenJDK11U-jre_x64_linux_hotspot_11.0.5_10.tar.gz [builder] Verifying checksum [builder] Expanding to /layers/org.cloudfoundry.openjdk/openjdk-jre [builder] Writing JAVA_HOME to shared ... [builder] Cloud Foundry Spring Boot Buildpack v1.0.157 [builder] Spring Boot 2.3.0.M1: Contributing to layer [builder] Writing CLASSPATH to shared [builder] Process types: [builder] spring-boot: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication [builder] task: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication [builder] web: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication 

Das Bild geht an:

 > Running exporter [exporter] Adding layer 'app' [exporter] Adding layer 'config' [exporter] Adding layer 'launcher' [exporter] Adding layer 'org.cloudfoundry.openjdk:openjdk-jre' [exporter] Adding layer 'org.cloudfoundry.jvmapplication:executable-jar' [exporter] Adding layer 'org.cloudfoundry.springboot:spring-boot' [exporter] Adding layer 'org.cloudfoundry.springautoreconfiguration:auto-reconfiguration' [exporter] *** Images (2757ab54378d): [exporter] docker.io/library/cnb:0.0.1-SNAPSHOT 

Abhängigkeiten werden zwischengespeichert:

 > Running cacher [cacher] Caching layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [cacher] Caching layer 'org.cloudfoundry.jvmapplication:executable-jar' [cacher] Caching layer 'org.cloudfoundry.springboot:spring-boot' [cacher] Caching layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' 

Erfolgreich erstelltes Image 'docker.io/library/cnbmail.0.1-SNAPSHOT'
ERFOLGREICH BAUEN in 25s

Das Bild ist bereits im Andockfenster sichtbar und kann mit dem Befehl andockfenster images angezeigt und das Andockfenster run docker run -d -p 8080: 8080 imageid ausgeführt werden

Fügen Sie unserer Anwendung neue Abhängigkeiten hinzu und erstellen Sie sie erneut.

Das System durchläuft zwischengespeicherte Ebenen:

 > Running restorer [restorer] Restoring cached layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [restorer] Restoring cached layer 'org.cloudfoundry.jvmapplication:executable-jar' [restorer] Restoring cached layer 'org.cloudfoundry.springboot:spring-boot' [restorer] Restoring cached layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' > Running analyzer [analyzer] Using cached layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [analyzer] Writing metadata for uncached layer 'org.cloudfoundry.openjdk:openjdk-jre' [analyzer] Using cached launch layer 'org.cloudfoundry.jvmapplication:executable-jar' [analyzer] Rewriting metadata for layer 'org.cloudfoundry.jvmapplication:executable-jar' [analyzer] Using cached launch layer 'org.cloudfoundry.springboot:spring-boot' [analyzer] Rewriting metadata for layer 'org.cloudfoundry.springboot:spring-boot' [analyzer] Using cached layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' [analyzer] Writing metadata for uncached layer 'org.cloudfoundry.springautoreconfiguration:auto-reconfiguration' 

Die Montage des Projekts beginnt analog zum letzten Schritt:


  > Running builder [builder] [builder] Cloud Foundry OpenJDK Buildpack v1.0.80 [builder] OpenJDK JRE 11.0.5: Reusing cached layer [builder] [builder] Cloud Foundry JVM Application Buildpack v1.0.113 [builder] Executable JAR: Reusing cached layer [builder] Process types: [builder] executable-jar: java -cp $CLASSPATH $JAVA_OPTS org.springframework.boot.loader.JarLauncher [builder] task: java -cp $CLASSPATH $JAVA_OPTS org.springframework.boot.loader.JarLauncher [builder] web: java -cp $CLASSPATH $JAVA_OPTS org.springframework.boot.loader.JarLauncher [builder] [builder] Cloud Foundry Spring Boot Buildpack v1.0.157 [builder] Spring Boot 2.3.0.M1: Contributing to layer [builder] Writing CLASSPATH to shared [builder] Process types: [builder] spring-boot: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication [builder] task: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication [builder] web: java -cp $CLASSPATH $JAVA_OPTS dev.ivanov.cnb.CnbApplication [builder] [builder] Cloud Foundry Spring Auto-reconfiguration Buildpack v1.0.159 [builder] Spring Auto-reconfiguration 2.11.0: Reusing cached layer > Running exporter [exporter] Adding layer 'app' [exporter] Adding layer 'config' [exporter] Reusing layer 'launcher' [exporter] Reusing layer 'org.cloudfoundry.openjdk:openjdk-jre' [exporter] Reusing layer 'org.cloudfoundry.jvmapplication:executable-jar' [exporter] Adding layer 'org.cloudfoundry.springboot:spring-boot' [exporter] Reusing layer 'org.cloudfoundry.springautoreconfiguration:auto-reconfiguration' [exporter] *** Images (7a83fadad1ce): [exporter] docker.io/library/cnb:0.0.1-SNAPSHOT > Running cacher [cacher] Reusing layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [cacher] Reusing layer 'org.cloudfoundry.jvmapplication:executable-jar' [cacher] Caching layer 'org.cloudfoundry.springboot:spring-boot' [cacher] Reusing layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' 

Erfolgreich erstelltes Image 'docker.io/library/cnbmail.0.1-SNAPSHOT'
ERFOLGREICH BAUEN in 20s

Die Montage wurde trotz des Auftretens zusätzlicher Abhängigkeiten im Projekt schneller als die vorherige durchgeführt - alles dank der Wiederverwendung von Containerschichten.

Um das resultierende Image genauer zu untersuchen, müssen Sie das Utility Pack von hier herunterladen und den Befehl inspect-image verwenden , um in ein Image zu schauen:

 "name": "openjdk-jre", "version": "11.0.5", "metadata": { "licenses": [ { "type": "GPL-2.0 WITH Classpath-exception-2.0", "uri": "https://openjdk.java.net/legal/gplv2+ce.html" } ], "name": "OpenJDK JRE", "sha256": "2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b", "stacks": [ "io.buildpacks.stacks.bionic", "org.cloudfoundry.stacks.cflinuxfs3" ], "uri": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.5%!B(MISSING)10/OpenJDK11U-jre_x64_linux_hotspot_11.0.5_10.tar.gz" }, "buildpack": { "id": "org.cloudfoundry.openjdk", "version": "v1.0.80" } }, { "name": "executable-jar", "version": "", "metadata": { "classpath": [ "/workspace" ], "main-class": "org.springframework.boot.loader.JarLauncher" }, "buildpack": { "id": "org.cloudfoundry.jvmapplication", "version": "v1.0.113" } 

Die Metadaten geben an, was im Bild enthalten ist, was sich in jeder Ebene befindet und wie es erstellt wurde. Dies ist ein eindeutiges Plus für die Sicherheit, da die Struktur jedes Bildes bekannt ist und Treffer auf "linken" Bibliotheken ausgeschlossen sind.

Aus diesem Grund bietet Cloud Native Buildpacks Mikroservice-Entwicklern eine interessante Funktionalität, vor allem für Spring Boot, da Pivotal entwickelt wird. Dies bedeutet, dass der Support in Ordnung ist. Erwähnenswert ist jedoch auch, dass CNB mit anderen Frameworks und Sprachen kompatibel ist.

Source: https://habr.com/ru/post/de485486/


All Articles