Suporte para Buildpacks no Spring Boot 2.3.0

Há alguns dias, o Spring Boot 2.3.0.M1 foi lançado, na descrição em que a primeira linha menciona suporte ao projeto Cloud Native Buildpacks, que é uma tentativa de simplificar a vida do desenvolvedor, permitindo a montagem mais automatizada de imagens dos códigos-fonte. Como nossos microsserviços precisam morar em contêineres no meu projeto atual, decidi experimentá-lo e descobrir quais são as vantagens. Uma breve continuação sob o corte.

O CNB (Cloud Native Buildpacks) permite que o desenvolvedor não escreva ou dê suporte ao seu próprio Dockerfile. Ao lançar a única equipe que cria o projeto CNB, ele determina quais dependências devem ser montadas em uma imagem. É assim:

imagem

Além disso, devido a várias tecnologias: suporte a OCI, estrutura modular, armazenamento em cache de camadas de dependência - o sistema CNB pode ser amplamente utilizado e, de acordo com os desenvolvedores, é bastante rápido.

Vamos verificar o que ele é de fato. Faça o download do projeto vazio do site start.spring.io. Adicione uma pitada de dependências para ver se nosso contêiner funciona.

É aqui que a preparação termina para nós - nosso aplicativo está pronto para ser colocado em um contêiner. Para fazer isso, execute o gradle "./gradlew bootBuildImage" ou para maven "./mvnw spring-boot: build-image" e a montagem será iniciada. Após a montagem, obtemos um registro conveniente com uma descrição de todo o processo.

Inicialmente, o plug-in obtém os artefatos básicos necessários:

> 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' 

São lançados detectores que examinam o projeto e determinam quais dependências coletar adicionalmente:

  > 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 

As dependências são baixadas e a montagem é iniciada:

  > 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 

A imagem está indo para:

 > 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 

As dependências são armazenadas em cache:

 > 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' 

Imagem criada com êxito 'docker.io/library/cnbmail.0.1-SNAPSHOT'
CONSTRUA BEM SUCEDIDO em 25s

A imagem já está visível na janela de encaixe e pode ser visualizada com o comando images da janela de encaixe e execute docker run docker run -d -p 8080: 8080 imageid

Adicione novas dependências ao nosso aplicativo e construa novamente.

O sistema passa por camadas em cache:

 > 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' 

A montagem do projeto começa de maneira semelhante à última etapa:


  > 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' 

Imagem criada com êxito 'docker.io/library/cnbmail.0.1-SNAPSHOT'
CONSTRUA BEM SUCEDIDO em 20s

A montagem foi montada mais rapidamente que a anterior, apesar do surgimento de dependências adicionais no projeto - tudo graças à reutilização das camadas do contêiner.

Para estudar a imagem resultante com mais detalhes, é necessário baixar o pacote de utilidades daqui e usar o comando inspect-image para procurar dentro de qualquer imagem:

 "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" } 

Os dados de metadados indicam o que está contido na imagem, o que está em cada camada e como foi criado. Essa é uma vantagem inequívoca em termos de segurança, já que a estrutura de cada imagem é conhecida e exclui ocorrências nas bibliotecas "esquerda" de produtos.

Assim, o Cloud Native Buildpacks fornece uma funcionalidade bastante interessante para desenvolvedores de microsserviços, principalmente no Spring Boot, pois o Pivotal está em desenvolvimento, o que significa que tudo ficará bem com o suporte. Mas também vale mencionar que o CNB é compatível com outras estruturas e idiomas.

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


All Articles