7.5 Configurando o Jib

O Jib (https://github.com/GoogleContainerTools/jib) é uma ferramenta utilizada para gerar imagem de aplicações Java sem a necessidade de utilizar um daemon do Docker. Ele pode ser adicionado ao projeto por meio de um plugin para o Maven (https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin), e separa a aplicação em múltiplas camadas, permitindo um processo de construção da aplicação granular e incremental.

Isso é possível, pois a imagem da aplicação é dividida em camadas de dependências, recursos e classes. Sendo assim, somente as camadas que forem alteradas são reconstruídas, não sendo necessário gerar novamente a imagem completa, o que permite um processo mais rápido, e com capacidade de reprodutibilidade, ou seja, imagens geradas a partir do mesmo código, tem a garantia de serem iguais. Essa capacidade é utilizada para evitar que a imagem seja reconstruída desnecessariamente.

Para configurarmos sua utilização no projeto, vamos alterar o arquivo pom.xml presente na raíz do projeto, adicionando nas propriedades (properties) a versão do Jib que vamos utilizar, no caso a versão 3.1.4:

<properties>
        <blc.version>2.2.0-GA</blc.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <gwt.version>2.4.0</gwt.version>
        <jib.maven-plugin-version>3.1.4</jib.maven-plugin-version>
</properties>

Na seção de plugins do mesmo arquivo, vamos adicionar o plugin do Jib:

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>${jib.maven-plugin-version}</version>

    <configuration>   
        <from>
            <image>registry-local:5005/loja-virtual-base</image>
        </from>   
        <to>
            <image>registry-local:5005/loja-virtual</image>
        </to> 
        <allowInsecureRegistries>true</allowInsecureRegistries>
        <container>
            <entrypoint>catalina.sh</entrypoint>
            <args>run</args>
            <!-- <mainClass>com.myservice.MyServiceApplication</mainClass> -->
            <jvmFlags>
                <jvmFlag>-Djava.security.egd=file:/dev/./urandom</jvmFlag>
            </jvmFlags>
            <appRoot>/usr/local/tomcat/webapps/devopsnapratica</appRoot>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
        </container>
    </configuration>
</plugin>

Observe que estamos usando a propriedade `jib.maven-plugin-version` definida no passo anterior para definir a versão do plugin.

Com a tag image, dentro da tag from, definimos qual será a imagem base que vamos utilizar para gerar nossa imagem. Já com a image dentro da tag to definimos qual o nome da imagem que será criada pelo Jib.

Como vamos utilizar um registry local do Docker para publicar a imagem, vamos definir como true a propriedade allowInsecureRegistries.

Já na propriedade entrypoint, dentro de container, especificaremos qual o script que será executado quando o container for inicializado, no caso, o arquivo catalina.sh, o qual receberá como argumento o parâmetro run, definido com a propriedade args.

Podemos definir flags que serão passadas para a JVM dentro da propriedade jvmFlags. Por último, vamos definir a localização da aplicação no container, com a propriedade appRoot e a data da criação da imagem, com a propriedade creationTime. Estamos usando a constante USE_CURRENT_TIMESTAMP que é a hora atual.

Para construir a imagem é necessário executar o seguinte comando:

mvn compile com.google.cloud.tools:jib-maven-plugin:3.2.1:build 

A saída do comando será semelhante a essa:

[INFO] Executing tasks:
[INFO] 
[INFO] 
[INFO] 
[INFO] Container entrypoint set to [catalina.sh]
[INFO] Container program arguments set to [run]
[INFO] 
[INFO] Built and pushed image as registry-local:5005/loja-virtual
[INFO] Executing tasks:
[INFO] [============================  ] 91,7% complete
[INFO] > launching layer pushers
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for loja-virtual-devops 1.0:
[INFO] 
[INFO] loja-virtual-devops ................................ SUCCESS [ 18.239 s]
[INFO] core ............................................... SUCCESS [ 15.845 s]
[INFO] admin .............................................. SUCCESS [ 30.405 s]
[INFO] site ............................................... SUCCESS [  7.916 s]
[INFO] combined ........................................... SUCCESS [ 12.807 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:28 min
[INFO] Finished at: 2022-04-28T12:52:02-03:00
[INFO] ------------------------------------------------------------------------

Para verificar se tudo deu certo, podemos usar o docker para fazer o pull da imagem:

docker pull registry-local:5005/loja-virtual

E na sequencia usar o comando docker images para ver detalhes da imagem baixada:

docker images registry-local:5005/loja-virtual
REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE
registry-local:5005/loja-virtual   latest    ff2161e222db   5 minutes ago   897MB

Como geramos nossa imagem, e publicamos no registry do Docker que configuramos anteriormente, podemos definir um Chart para nosso projeto, de modo que seja possível realizar a implantação da aplicação no cluster Kubernetes. Veremos como realizar esse passo na próxima seção.

Last updated