Categorias
Buildah Container DevOps Docker Podman

Buildah! Existe vida após o Docker…

o Kubernetes não quer papo com o Docker, então venho te apresentar o Buildah, esse bulldog francês simpático que cria suas imagens de container de forma bem amigável!

Vamos começar a falar um pouco sobre as preocupações na criação de container quando há cada vez mais adeptos? Pois bem, o Docker chegou e já se tornou um padrão de criação e uso de containers, a comunidade de nerds decidiu então, em 2015, definir um padrão aberto para não deixar que as empresas detentoras do mercado travasse o método de runtimes e os formatos dos containers. De um lado, CoreOS e o Docker, iniciaram o Open Container Initiative (OCI – guarde essa sigla, falarei dela depois) uma tentativa de padronizar o runtime dos containers e toda a especificação do formato open de imagem. Bom, essa tentativa tomou muito corpo e hoje possui muita força, sendo que é suportado pela maior, senão todos, repositórios de imagens comuns (Docker Hub, ECR da querida Amazon, etc…).

Eu sei que neste momento você, que já sabe usar o Docker, pode estar se perguntando: _Caro autor deste blog, tão sábio, bonito, elegante, cheiroso e garboso, afinal, o que é runtime de container?

Muito capciosa tua pergunta meu quiridu, pois então, os runtime são softwares (ou é o software) que executa os containers e gerenciam imagens destes containers. Um exemplo do runtime mais conhecido atualmente é o Docker, mas eu já falei do Podman aqui neste blog lindo de vivê que é uma promessa agora que o Kubernetes está dispensando o Docker!

Ok, ok… entendi o que é runtime, mas o que Buildah tem que a ver com essa treta toda?

Como diria nosso Guru do Himalaia, mííítico menininho… Buildah é um software especializado em tratar imagens (criação e manutenção), já que o Podman é apenas um container runtime. E não se preocupe com seus arquivos Dockerfile pois eles já seguem o padrão OCI (lembra dele?) fazendo com que o Buildah construa essa imagem lindamente e maravilhosamente para você.

Mas… o Buildah tem sua própria sintaxe, e você pode estar achando isso totalmente enfadonho, mas vou te dizer, é muito interessante, mas vamos por a mão na massa?

Instalando o Buildah

Claro que você vai estar usando o Ubuntu 20.10 né!? Poxa… me ajude a te ajudar! Mas caso não use, olha só que moleza que os caras do Buildah fizeram aqui!

# Ubuntu 20.10 and newer 
sudo apt-get -y update 
sudo apt-get -y install buildah
Pronto! Parece magia.. mas é tecnologia.

Construindo uma imagem de um Dockerfile

Você, claro, já tem seu Dockerfile aí né?! Então meu quiridu, só executar o comando?

buildah bud -t suaimagem:1.0 Dockerfile
#Explicando essa bagaça:
#bud: Não é a Budweiser, mas pode abrir uma! Bud é um acrônimo para build-usign-dockerfile... bom o comando já diz tudo né?
#-t: assim como no Docker você tbm define a tag (name and version) da imagem... simples, nénão?
#Dockerfile: indicação do teu arquivo Dockerfile... só isso!

Construindo uma imagem usando a sintaxe do Buildah

Agora o bicho vai pegar! A gente já vê uma pequena diferença no Buildah que é a utilização de comandos nativos para manipular a imagem de container. Para dar um exemplo, vou criar uma arquivo bash de criação de uma imagem de container com ubi8 da RedHat e o Apache httpd, apenas para trazer uma complexidade maior ao arquivo e termos mais comandos para explicar, que poderá ser útil para você que quer testar depois com uma imagem Ubuntu, Debian, nginx puro…

Primeiro vamos criar um arquivo chamado buildah.sh

!/bin/bash
set -o errexit

# Vamos criar o container, criando uma variavel é mais facil manipular esta imagem de container
container=$(buildah from registry.access.redhat.com/ubi8/ubi:latest)

# Vamos instalar o apache (httpd)
buildah run $container -- yum -y install httpd

# E depois criar um simples HTML
 echo "<html><head><title>Hello Buildah</title></head><body><h1>Welcome to your first Buildah image!</h1></body></html>" > index.html

# E então compiamos este html para dentro da imagem de container
buildah copy $container index.html /var/www/html/index.html
 
# Vamos configurar para que o httpds inicie junto
buildah config --cmd "/usr/sbin/httpd -D FOREGROUND" $container

# Vamos expor a porta 80
buildah config --port 80 $container
 
# Voilá! Vamos salvar as alterações e commitar o container modificado usando o Buildah!
buildah commit $container myhttpd

Execute então o chmod para podermos executar este arquivo bash

chmod +x buildah.sh
./buildah.sh

Se tudo deu certo, você deverá visualizar algo parecido com isso:

 Getting image source signatures
 Copying blob 6500ac87b29f done  
 Copying blob 1b8dabac56ed done  
 Copying config 33df2983b0 done  
 Writing manifest to image destination
 Storing signatures
 Updating Subscription Management repositories.
 Unable to read consumer identity
 

 This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
 

 Red Hat Universal Base Image 8 (RPMs) - BaseOS                 1.8 MB/s | 771 kB     00:00    
 Red Hat Universal Base Image 8 (RPMs) - AppStream               16 MB/s | 4.8 MB     00:00    
 Red Hat Universal Base Image 8 (RPMs) - CodeReady Builder      230 kB/s |  13 kB     00:00    
 Dependencies resolved.
 ===============================================================================================
  Package             Arch    Version                                    Repository        Size
 ===============================================================================================
 Installing:
  httpd               x86_64  2.4.37-30.module+el8.3.0+7001+0766b9e7     ubi-8-appstream  1.4 M
 Installing dependencies:
  apr                 x86_64  1.6.3-11.el8                               ubi-8-appstream  125 k
  apr-util            x86_64  1.6.1-6.el8                                ubi-8-appstream  105 k
  httpd-filesystem    noarch  2.4.37-30.module+el8.3.0+7001+0766b9e7     ubi-8-appstream   37 k
  httpd-tools         x86_64  2.4.37-30.module+el8.3.0+7001+0766b9e7     ubi-8-appstream  104 k
  mailcap             noarch  2.1.48-3.el8                               ubi-8-baseos      39 k
  mod_http2           x86_64  1.15.7-2.module+el8.3.0+7670+8bf57d29      ubi-8-appstream  154 k
  redhat-logos-httpd  noarch  81.1-1.el8                                 ubi-8-baseos      26 k
 Installing weak dependencies:
  apr-util-bdb        x86_64  1.6.1-6.el8                                ubi-8-appstream   25 k
  apr-util-openssl    x86_64  1.6.1-6.el8                                ubi-8-appstream   27 k
 Enabling module streams:
  httpd                       2.4                                                              
 

 Transaction Summary
 ===============================================================================================
 Install  10 Packages
 

 Total download size: 2.0 M
 Installed size: 5.4 M
 Downloading Packages:
 (1/10): redhat-logos-httpd-81.1-1.el8.noarch.rpm               672 kB/s |  26 kB     00:00    
 (2/10): mailcap-2.1.48-3.el8.noarch.rpm                        961 kB/s |  39 kB     00:00    
 (3/10): apr-util-1.6.1-6.el8.x86_64.rpm                        2.4 MB/s | 105 kB     00:00    
 (4/10): apr-util-openssl-1.6.1-6.el8.x86_64.rpm                4.6 MB/s |  27 kB     00:00    
 (5/10): apr-util-bdb-1.6.1-6.el8.x86_64.rpm                    5.1 MB/s |  25 kB     00:00    
 (6/10): httpd-filesystem-2.4.37-30.module+el8.3.0+7001+0766b9e 3.2 MB/s |  37 kB     00:00    
 (7/10): mod_http2-1.15.7-2.module+el8.3.0+7670+8bf57d29.x86_64  11 MB/s | 154 kB     00:00    
 (8/10): apr-1.6.3-11.el8.x86_64.rpm                            9.4 MB/s | 125 kB     00:00    
 (9/10): httpd-tools-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86 6.9 MB/s | 104 kB     00:00    
 (10/10): httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64.r  33 MB/s | 1.4 MB     00:00    
 -----------------------------------------------------------------------------------------------
 Total                                                           22 MB/s | 2.0 MB     00:00     
 Running transaction check
 Transaction check succeeded.
 Running transaction test
 Transaction test succeeded.
 Running transaction
   Preparing        :                                                                       1/1 
   Installing       : apr-1.6.3-11.el8.x86_64                                              1/10 
   Running scriptlet: apr-1.6.3-11.el8.x86_64                                              1/10 
   Installing       : apr-util-openssl-1.6.1-6.el8.x86_64                                  2/10 
   Installing       : apr-util-bdb-1.6.1-6.el8.x86_64                                      3/10 
   Installing       : apr-util-1.6.1-6.el8.x86_64                                          4/10 
   Running scriptlet: apr-util-1.6.1-6.el8.x86_64                                          4/10 
   Installing       : httpd-tools-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64            5/10 
   Running scriptlet: httpd-filesystem-2.4.37-30.module+el8.3.0+7001+0766b9e7.noarch       6/10 
   Installing       : httpd-filesystem-2.4.37-30.module+el8.3.0+7001+0766b9e7.noarch       6/10 
   Installing       : mailcap-2.1.48-3.el8.noarch                                          7/10 
   Installing       : redhat-logos-httpd-81.1-1.el8.noarch                                 8/10 
   Installing       : mod_http2-1.15.7-2.module+el8.3.0+7670+8bf57d29.x86_64               9/10 
   Installing       : httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64                 10/10 
   Running scriptlet: httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64                 10/10 
   Verifying        : redhat-logos-httpd-81.1-1.el8.noarch                                 1/10 
   Verifying        : mailcap-2.1.48-3.el8.noarch                                          2/10 
   Verifying        : apr-util-1.6.1-6.el8.x86_64                                          3/10 
   Verifying        : apr-util-openssl-1.6.1-6.el8.x86_64                                  4/10 
   Verifying        : apr-util-bdb-1.6.1-6.el8.x86_64                                      5/10 
   Verifying        : httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64                  6/10 
   Verifying        : httpd-filesystem-2.4.37-30.module+el8.3.0+7001+0766b9e7.noarch       7/10 
   Verifying        : mod_http2-1.15.7-2.module+el8.3.0+7670+8bf57d29.x86_64               8/10 
   Verifying        : apr-1.6.3-11.el8.x86_64                                              9/10 
   Verifying        : httpd-tools-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64           10/10 
 Installed products updated.
 

 Installed:
   apr-1.6.3-11.el8.x86_64                                                                      
   apr-util-1.6.1-6.el8.x86_64                                                                  
   apr-util-bdb-1.6.1-6.el8.x86_64                                                              
   apr-util-openssl-1.6.1-6.el8.x86_64                                                          
   httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64                                          
   httpd-filesystem-2.4.37-30.module+el8.3.0+7001+0766b9e7.noarch                               
   httpd-tools-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64                                    
   mailcap-2.1.48-3.el8.noarch                                                                  
   mod_http2-1.15.7-2.module+el8.3.0+7670+8bf57d29.x86_64                                       
   redhat-logos-httpd-81.1-1.el8.noarch                                                         
 

 Complete!
 d7545ad7e54275eb4930f26ef9e589bc2c1caf8c5a3b0315371e874190c944dc
 Getting image source signatures
 Copying blob 0b5feeefca25 skipped: already exists  
 Copying blob 37ab7f712dcb skipped: already exists  
 Copying blob 0c4d36168ff4 done  
 Copying config 1916d8449e done  
 Writing manifest to image destination
 Storing signatures
 1916d8449e2e22ae624109a7dcde083d963bbcb37a9c92644d1c45218aa80c31 

Será que deu certo mesmo? Vamos ver, execute o comando abaixo e veja se sua imagem já está listada

buildah images

E você deverá ver sua imagem sendo listada parecido assim:

 REPOSITORY                            TAG      IMAGE ID       CREATED              SIZE
 localhost/myhttpd                     latest   1916d8449e2e   About a minute ago   241 MB
 registry.access.redhat.com/ubi8/ubi   latest   33df2983b061   6 weeks ago          208 MB 

Perceba que o nosso myhttpd está ali! E agora, vamos unir o Podman pra essa bagaça… vamos executar este container com o Podman. Basta executar o seguinte comando:

podman run -d -p 8080:80 localhost/myhttpd

Pronto, simples, fácil, tranquilo e favorável! Aposto que tu sabe que pode testar entrando por este URL né? http://localhost:8080

Agora solte sua imagina e crie suas imagens de container com o Buildah!!!

buildah logo

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *