Skip to main content

Criando imagens de contêiner Java com Jib

Escrito por
Java engineering

17 de agosto de 2021

0 minutos de leitura

Se você trabalha com imagens de contêiner há algum tempo, provavelmente conhece os onipresentes documentos que descrevem, camada por camada, as etapas necessárias para criar uma imagem: os Dockerfiles. Você sabia que há cada vez mais ferramentas para criar imagens compatíveis com OCI sem Dockerfiles? Neste artigo, vamos conhecer o Jib, uma ferramenta 100% baseada em Java que cria imagens altamente otimizadas sem que você precise se preocupar em montar um Dockerfile corretamente.

Vou partir do princípio de que você já entende como as imagens são criadas e tem pelo menos uma noção básica de Dockerfiles. Mas, se ainda não conhece esse assunto, talvez queira conferir meu artigo sobre fluxos de trabalho orientados por desenvolvedores, no qual explico em detalhes como criar imagens de contêiner.

O problema

Como desenvolvedor Java, além da base de código do seu aplicativo e das dependências das bibliotecas, você provavelmente também está acostumado a acompanhar qual JDK e JVM está usando como alvo. Isso pode incluir a versão do servidor de aplicativos web sobre o qual você está desenvolvendo e talvez algumas configurações de execução, como ajustes do coletor de lixo e conexões com o banco de dados. O que talvez você não tenha precisado considerar são questões no nível do sistema operacional, como instalação de pacotes, permissões do sistema de arquivos, qual UID/GID é usado em tempo de execução e outros detalhes de configuração que, historicamente, ficam a cargo das equipes de operações e segurança responsáveis por fornecer as plataformas.

Com a adoção de ambientes de execução de contêineres e dos sistemas de orquestração que funcionam sobre eles, muitas dessas preocupações de nível mais baixo estão passando a fazer parte do escopo das equipes de desenvolvimento, na forma de arquivos de configuração de infraestrutura como código (IaC) que ficam nos repositórios de código dos aplicativos e serviços. Esses arquivos podem assumir vários formatos, como YAML do Kubernetes, HCL do Terraform, JSON do CloudFormation e, é claro, Dockerfiles, que definem a estrutura da imagem de contêiner onde seu aplicativo será executado.

Empacotar seu aplicativo em uma imagem e executá-lo em um contêiner geralmente não é muito difícil. Mas garantir que a imagem esteja bem formada, otimizada, segura e em conformidade com os padrões da sua organização pode ser um desafio. Agora, espera-se que os desenvolvedores aprendam a usar ferramentas de análise no nível do sistema operacional, mantenham padrões de rotulagem de imagens, conheçam as práticas recomendadas mais recentes para Dockerfiles e assumam outras responsabilidades. Ferramentas de lint e análise, como Hadolint, Dockle e nossa solução Snyk Container, podem ajudar nessas tarefas. Mas e se pudéssemos automatizar a maioria — ou até todos — desses novos requisitos e conteúdos padronizados?

Conheça o Jib: uma ferramenta 100% baseada em Java para criar imagens de contêiner

O Jib é uma ferramenta de código aberto, 100% baseada em Java, que cria imagens de contêiner compatíveis com OCI (Docker v2) sem Dockerfile ou mesmo sem um ambiente de execução de contêiner. O Jib pode ser usado como uma ferramenta de linha de comando independente, mas o mais comum é usá-lo como um plugin de etapa de build do Maven ou Gradle. Com o plugin, basta executar o mesmo comando de build mvn ou gradle que você já usa para criar seus artefatos .jar, .war etc. e também criar — e, opcionalmente, implantar — uma imagem OCI pronta para executar seu aplicativo em um contêiner.

Partindo de um aplicativo Spring Boot, adicionar o Jib é simples: basta inserir este trecho XML no arquivo pom.xml do Maven (a documentação completa está aqui) e executar novamente o comando mvn package. Há algumas opções que podemos definir aqui para escolher onde colocar o contêiner. Para simplificar, este exemplo implanta a imagem em um registro que usaremos mais tarde para executá-la, mas você também pode salvar a imagem em um arquivo **.**tar local ou, se tiver um daemon do Docker em execução e acessível, no cache local de imagens do Docker (como faria um build do Docker).

<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<to>
<image>reg.mycorp.com/smalls/spring-goof</image>
</to>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
$mvn package
...
[INFO] --- jib-maven-plugin:3.1.1:build (default) @ spring-goof ---
[WARNING] 'mainClass' configured in 'maven-jar-plugin' is not a valid Java class: ${start-class}
[INFO] 
[INFO] Containerizing application to localhost:5000/spring-goof...
[WARNING] Base image 'adoptopenjdk:8-jre' does not use a specific image digest - build may not be reproducible
[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: localhost:5000
[WARNING] 
Got output:

credentials not found in native keychain

[WARNING] Cannot verify server at https://localhost:5000/v2/. Attempting again with no TLS verification.
[WARNING] Failed to connect to https://localhost:5000/v2/ over HTTPS. Attempting again with HTTP.
[INFO] The base image requires auth. Trying again for adoptopenjdk:8-jre...
[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: registry-1.docker.io
[WARNING] 
Got output:

credentials not found in native keychain

[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: registry.hub.docker.com
[WARNING] 
Got output:

credentials not found in native keychain

[INFO] Using credentials from Docker config (/Users/eric/.docker/config.json) for adoptopenjdk:8-jre
[INFO] Using base image with digest: sha256:117fae95422c19f1c1ddfb0f869913c1d934547e8eb903738a9fd2c3ad11a207
[INFO] 
[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, org.snyk.groceries.SpringGoofApplication]
[INFO] 
[INFO] Built and pushed image as localhost:5000/spring-goof
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.169 s
[INFO] Finished at: 2021-06-28T14:43:49-05:00
[INFO] ------------------------------------------------------------------------

Observação: Vamos falar um pouco mais adiante sobre algumas linhas interessantes de “aviso” na saída acima.

Agora, em uma máquina com um ambiente de execução de contêiner disponível, basta executar o contêiner: docker run --rm -it -p 8080:8080 myimage:tag

$ docker run --rm -it -p8080:8080 reg.mycorp.com/smalls/spring-goof
Unable to find image reg.mycorp.com/smalls/spring-goof:latest' locally
latest: Pulling from spring-goof
c549ccf8d472: Pull complete 
bd7766c75e8f: Pull complete 
7e80a3d8823a: Pull complete 
a7321fbff05c: Pull complete 
05d4865ff251: Pull complete 
e8d1ce8a5389: Pull complete 
bc56aad8a781: Pull complete 
Digest: sha256:74710d3c27ad84cb594b84a519c111a2b04a611ca52ac81f644e3ab5e15d0063
Status: Downloaded newer image for reg.mycorp.com/smalls/spring-goof:latest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.5.RELEASE)

2021-06-28 19:54:51.550  INFO 1 --- [           main] o.snyk.groceries.SpringGoofApplication   : Starting SpringGoofApplication on beaa3641ca38 with PID 1 (/app/classes started by root in /)

Se você usa Gradle, confira a documentação oficial para ver todos os detalhes sobre como fazer o mesmo no arquivo build.gradle.

É só isso: não é preciso usar Dockerfile nem ferramentas extras para criar imagens. Basta usar as mesmas ferramentas de build que você já usa para criar seus artefatos Java. Isso não só facilita a vida dos desenvolvedores, como também torna o suporte a agentes de build de CI muito mais simples, já que não é preciso expor o socket do Docker nem gerenciar outras ferramentas de build.

Analisando a imagem em detalhes

Tudo bem, o processo de criação da imagem pode ser mais simples, mas, se você for como eu quando vi isso pela primeira vez, provavelmente tem perguntas como...

Como o Jib cria imagens?

Como qualquer ferramenta de criação de imagens, o Jib cria um conjunto de camadas do sistema de arquivos que contêm o ambiente de execução do Java, seu aplicativo e todas as dependências, além dos metadados que o mecanismo de contêiner usa para saber como iniciar a JVM.

Veja as informações das camadas deste exemplo, exibidas pelo comando docker image history:

$ docker image history localhost:5000/spring-goof:latest 
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
4c125b59f147   51 years ago   jib-maven-plugin:3.1.1                          79B       jvm arg files
<missing>      51 years ago   jib-maven-plugin:3.1.1                          6.36kB    classes
<missing>      51 years ago   jib-maven-plugin:3.1.1                          0B        resources
<missing>      51 years ago   jib-maven-plugin:3.1.1                          30MB      dependencies
<missing>      10 days ago    /bin/sh -c #(nop)  ENV JAVA_HOME=/opt/java/o…   0B        
<missing>      10 days ago    /bin/sh -c set -eux;     ARCH="$(dpkg --prin…   108MB     
<missing>      10 days ago    /bin/sh -c #(nop)  ENV JAVA_VERSION=jdk8u292…   0B        
<missing>      10 days ago    /bin/sh -c apt-get update     && apt-get ins…   43.2MB    
<missing>      10 days ago    /bin/sh -c #(nop)  ENV LANG=en_US.UTF-8 LANG…   0B        
<missing>      10 days ago    /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      10 days ago    /bin/sh -c #(nop) ADD file:920cf788d1ba88f76…   72.7MB    

Observe que as datas CREATED das primeiras quatro camadas mostram “51 years ago” (“há 51 anos”). Isso é consequência da estratégia de builds reproduzíveis do Jib, que busca criar exatamente os mesmos hashes de camada para builds da mesma base de código. Para saber mais, consulte as perguntas frequentes.

Como mostram os comentários das camadas, temos várias camadas da imagem base padrão do AdoptOpenJDK — falaremos mais sobre isso adiante — seguidas, nesta ordem, por:

  • Dependências de bibliotecas definidas nos arquivos Maven/Gradle

  • Arquivos de recursos

  • Arquivos de classe do código compilado do aplicativo

  • Arquivos de argumentos da JVM.

Vamos nos aprofundar um pouco mais e usar a ferramenta de código aberto dive para ver quais arquivos estão em cada uma dessas quatro camadas:

Dependências

Esta camada contém todos os arquivos .jar adicionados à pasta /app/libs.

│ Layers ├──────────────────────────────────────────────────────────────────── ┃ ● Current Layer Contents ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0      30 MB  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0      30 MB      └── libs
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0     445 kB          ├── antlr-2.7.7.jar
     30 MB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     1.9 MB          ├── aspectjweaver-1.8.10.jar
       0 B  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0      65 kB          ├── classmate-1.3.3.jar
    6.4 kB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     314 kB          ├── dom4j-1.6.1.jar
      79 B  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0      13 kB          ├── evo-inflector-1.2.2.jar
                                                                               -rw-r--r--         0:0     1.8 MB          ├── h2-1.4.196.jar
│ Layer Details ├───────────────────────────────────────────────────────────── -rw-r--r--         0:0      75 kB          ├── hibernate-commons-annotations-5
                                                                               -rw-r--r--         0:0     5.6 MB          ├── hibernate-core-5.0.12.Final.jar
Tags:   (unavailable)                                                          -rw-r--r--         0:0     612 kB          ├── hibernate-entitymanager-5.0.12.
Id:     da844eca910f44e825c72121f4ec9700b3c9eec8d4c2407f926cdad0799b33e8       -rw-r--r--         0:0     113 kB          ├── hibernate-jpa-2.1-api-1.0.0.Fin
Digest: sha256:0862e7d5215a0ec2cf7d5a8864a5a0439d9c70c39b14cdc6c38f41487ca8f23 -rw-r--r--         0:0     726 kB          ├── hibernate-validator-5.3.5.Final
Command:                                                                       -rw-r--r--         0:0      56 kB          ├── jackson-annotations-2.8.0.jar
jib-maven-plugin:3.1.1                                                         -rw-r--r--         0:0     283 kB          ├── jackson-core-2.8.9.jar

Recursos

Aqui vemos /app/resources e todos os arquivos associados das nossas pastas de recursos.

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0        0 B  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0        0 B      └── resources
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0        0 B          ├── application.properties
     30 MB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B          └── org                     
       0 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B              └── snyk           
    6.4 kB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B                  └── groceries
      79 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B                      ├── domain     
                                                                               drwxr-xr-x         0:0        0 B                      └── repository
│ Layer Details ├─────────────────────────────────────────────────────────────                                                                               

Tags:   (unavailable)                                                                                                                                        
Id:     7891783fbddf2ac3f624ecdea6fd7d51efa476bf87b82a3a1da2517167a7812a                                                                                     
Digest: sha256:bc7cee3aeb381d0b453212f345eaf34f55613c2dbb988af22f626877f4ecc89                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1                                              

Classes

Os arquivos .class gerados durante a fase de compilação do build estão nesta camada, em /app/classes.

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0     6.4 kB  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0     6.4 kB      └── classes  
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC drwxr-xr-x         0:0     6.4 kB          └── org                   
     30 MB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     6.4 kB              └── snyk                
       0 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     6.4 kB                  └── groceries  
    6.4 kB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     3.3 kB                      ├── SpringGoofApplicati
      79 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     1.7 kB                      ├── domain     
                                                                               -rw-r--r--         0:0     1.7 kB                      │   └── Item.class
│ Layer Details ├───────────────────────────────────────────────────────────── drwxr-xr-x         0:0     1.3 kB                      └── repository         
                                                                               -rw-r--r--         0:0     1.3 kB                          └── ItemRepository.
Tags:   (unavailable)                                                                                                                                        
Id:     5d4509a5f5856f5d6de92ed621d301861fccf414f9088d0c81e47572f48e4194                                                                                     
Digest: sha256:778c99f6b1c637ab73e3fff99e933d6d6a8d247f9849d2695066c4f2e823ee7                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1  

Arquivos de argumentos da JVM

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0       79 B  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t -rw-r--r--         0:0       39 B      ├── jib-classpath-file
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0       40 B      └── jib-main-class-file       
     30 MB  jib-maven-plugin:3.1.1                                                                                                                    
       0 B  jib-maven-plugin:3.1.1                                                                                                               
    6.4 kB  jib-maven-plugin:3.1.1                                                                                                                           
      79 B  jib-maven-plugin:3.1.1                                                                                                                   

│ Layer Details ├─────────────────────────────────────────────────────────────                                                                               

Tags:   (unavailable)                                                                                                                                        
Id:     22877091a2de894cac9070c121b116e5d3247b3a4f81774032c0698bf6a2de2f                                                                                     
Digest: sha256:d8a8afa0a3d1efdb00b38b28e3dd075342c0dc65e52977e56dd3f21c277ae94                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1             

Por fim, temos alguns arquivos com os argumentos usados para iniciar a JVM no contêiner, na pasta de nível superior /app. Neste exemplo, se você inspecionar o conteúdo desses dois arquivos, encontrará o classpath de execução e as informações da classe principal.

# cat jib-classpath-file
/app/resources:/app/classes:/app/libs/*

# cat jib-main-class-file
org.snyk.groceries.SpringGoofApplication

Observação: Dependendo da estrutura do seu build Maven/Gradle, as imagens criadas pelo Jib podem ter mais camadas. Consulte as perguntas frequentes do Jib para saber mais sobre outras camadas possíveis.

Qual imagem base o Jib usa? E se eu precisar usar minha própria imagem?

Por padrão, o Jib usa a imagem base oficial adoptopenjdk:jre-8 do Docker Hub para builds de arquivos JAR ou a imagem base oficial jetty do Docker Hub para builds de arquivos WAR. É possível configurar isso nas opções do plugin. Consulte a documentação oficial para ver os detalhes, incluindo como definir um ENTRYPOINT, USER personalizado ou outras declarações, se necessário. A documentação também explica por que é uma boa ideia definir sua própria imagem base e usar um hash específico para garantir a reprodutibilidade dos builds. Muitas organizações têm imagens base internas “aprovadas”, que as equipes de desenvolvimento devem usar e que foram auditadas e reforçadas pelas equipes de segurança e operações. Veja um exemplo de como modificar o pom.xml do Maven para usar uma imagem desse tipo.

<build>
<plugins>
...
<plugin>
...
<configuration>
<from>
<image>reg.mycorp.com/smalls-base/openjdk:8u292-2021.7.4</image>
</from>
...
</configuration>
...
</plugin>
...
</plugins>
</build>

Também há suporte a configurações adicionais, como a padronização de rótulos de imagens. Por exemplo, suponha que sua organização exija que todas as imagens incluam os seguintes rótulos:

  • URL do Git do código-fonte

  • ID/hash do commit do Git

  • Versão do build do projeto Maven

Supondo que o pom.xml já tenha acesso a esses dados, adicionar os rótulos à configuração do plugin Jib é muito simples:

<build>
<plugins>
...
<plugin>
...
<configuration>
...
<container>
<labels>
<git.remote.origin.url>${git.remote.origin.url}</git.remote.origin.url>
<git.commit.id>${git.commit.id}</git.commit.id>
<mvn.build.version>${project.version}</mvn.build.version>
</labels>
</container>
...
</configuration>
...
</plugin>
...
</plugins>
</build>

Ao inspecionar a imagem criada, vemos que os rótulos foram aplicados, como se tivessem sido adicionados por linhas LABELS do Dockerfile (estou usando a ótima ferramenta de linha de comando jq para extrair apenas esse array da resposta).

$ docker image inspect reg.mycorp.com/smalls/spring-goof:latest | jq .[].Config.Labels
{
  "git.commit.id": "960d768e9739ffb8e9a503c9ad3f6dad86ac68b1",
  "git.remote.origin.url": "git@github.com:mycorp-dev/spring-goof.git",
  "mvn.build.version": "0.0.1-SNAPSHOT"
}

Agora imagine que toda a complexidade dessas configurações padronizadas esteja definida em um POM pai, por meio de <pluginManagement> e outras configurações comuns do Maven. Os desenvolvedores não precisam mais se preocupar com todo esse XML padronizado, nem sequer precisam examiná-lo. E os arquitetos podem aplicar e atualizar os padrões em toda a organização sem incomodar as equipes!

Como posso ter certeza de que tudo está seguro?

Um dos desafios das ferramentas mais genéricas para criar imagens, como o Dockerfile, é que você pode fazer praticamente qualquer coisa durante o build: instalar pacotes, usar ADD para baixar arquivos de servidores web aleatórios e executar inúmeras outras etapas que precisam ser analisadas e revisadas com cuidado. Com o Jib, muitas dessas escolhas são aplicadas automaticamente, e substituí-las exige alterações explícitas na configuração do Maven/Gradle, que ficam claramente visíveis na revisão de código, assim como mudanças em uma dependência ou em qualquer outra configuração de build.

Quanto à análise de segurança, um dos grandes recursos do Snyk Container é recomendar imagens base com menos vulnerabilidades. Desde hoje, esse recurso também funciona sem um Dockerfile que indique qual imagem base você está usando. Isso significa que imagens criadas pelo Jib — ou por qualquer ferramenta que não use Dockerfile — também podem aproveitar as mesmas recomendações.

Se quiser acompanhar e analisar seus próprios contêineres Java, crie uma conta gratuita e veja as instruções para instalar a ferramenta de análise da Snyk.

Neste exemplo, defini openjdk:8u121-jre como imagem base, executei mvn package e baixei a imagem para meu laptop. Agora, basta executar snyk container test nela.

$ snyk container test localhost:5000/spring-goof:latest

Testing localhost:5000/spring-goof:latest...

... (a bunch of scan results removed here) ...

Organization:      mycorp-snyk-org
Package manager:   deb
Project name:      docker-image|reg.mycorp.com/smalls/spring-goof:latest
Docker image:      reg.mycorp.com/smalls/spring-goof:latest
Platform:          linux/amd64
Base image:        openjdk:8u181-jre-stretch
Licenses:          enabled

Tested 261 dependencies for known issues, found 410 issues.

Base Image                 Vulnerabilities  Severity
openjdk:8u181-jre-stretch  410              149 high, 91 medium, 170 low

Recommendations for base image upgrade:

Minor upgrades
Base Image             Vulnerabilities  Severity
openjdk:8-jre-stretch  205              71 high, 36 medium, 98 low

Major upgrades
Base Image                  Vulnerabilities  Severity
openjdk:11.0.5-jre-stretch  178              66 high, 28 medium, 84 low

Alternative image types
Base Image                         Vulnerabilities  Severity
openjdk:17-ea-22-oraclelinux8      0                0 high, 0 medium, 0 low
openjdk:16-jdk-oraclelinux7        0                0 high, 0 medium, 0 low
openjdk:17-ea-27-jdk-oraclelinux7  0                0 high, 0 medium, 0 low
openjdk:16-ea-29-jdk-oraclelinux8  0                0 high, 0 medium, 0 low

Como você pode ver, a análise detectou automaticamente openjdk:8u181-jre-stretch como imagem base (uma tag de alias para openjdk:8u181-jre) e informou suas 410 vulnerabilidades. Também recomendou algumas opções para mudar a imagem base, desde uma atualização de versão secundária até a tag mais recente openjdk:8-jre — que tem cerca de metade dos problemas — e versões mais novas da JVM sem nenhuma vulnerabilidade.

Como você pode ver, não só conseguimos descobrir quais vulnerabilidades estão presentes na imagem que usamos, como também recebemos recomendações para corrigi-las usando uma imagem base mais recente, tudo isso sem escrever uma única linha de código em um Dockerfile.

Conclusão

Como vimos, o Jib pode facilitar muito para os desenvolvedores a criação de contêineres para aplicativos Java, eliminando a necessidade de aprender a sintaxe do Dockerfile ou instalar ferramentas desconhecidas. Ele também ajuda os arquitetos a gerenciar a padronização usando os recursos conhecidos de hierarquia de projetos do Maven ou Gradle. Como o Jib cria imagens compatíveis com OCI, você também pode usar ferramentas padrão do setor — como o scanner Snyk Container — para inspecionar, implantar e executar seu aplicativo.

Se você também dá suporte a projetos que não são Java, há outras ferramentas nesse espaço que vale a pena considerar, como Buildah, Bazel, Earthly e vários projetos relacionados ao BuildKit. Além disso, meu colega Pas Apicella publicou recentemente um artigo sobre Cloud Native Build Packs que vale muito a pena ler.

Não se esqueça de criar sua conta gratuita e começar hoje mesmo a analisar seus contêineres, dependências de código aberto e código IaC!

Proteja a infraestrutura desde a origem

A Snyk automatiza a segurança e a conformidade de IaC nos fluxos de trabalho e detecta recursos com configurações divergentes ou ausentes.