Red Hat Training

A Red Hat training course is available for RHEL 8

9.5. Criando imagens a partir do zero com Buildah

Em vez de começar com uma imagem de base, você pode criar um novo recipiente que não contenha nenhum conteúdo e apenas uma pequena quantidade de metadados do recipiente. Isto é referido como um contêiner scratch. Aqui estão algumas questões a serem consideradas ao optar por criar uma imagem a partir de um contêiner a partir do zero com o comando buildah:

  • Ao construir um contêiner de risco você pode copiar um executável sem dependências na imagem de risco e fazer algumas configurações para conseguir um contêiner mínimo para funcionar.
  • Para usar ferramentas como yum ou pacotes rpm para preencher o contêiner de raspar, é necessário pelo menos inicializar um banco de dados RPM no contêiner e adicionar um pacote de liberação. O exemplo abaixo mostra como fazer isso.
  • Se você acabar adicionando muitos pacotes de RPM, considere o uso das imagens de base ubi ou ubi-minimal em vez de uma imagem de arranhão. Essas imagens de base tiveram documentação, pacotes de idiomas e outros componentes cortados, o que pode resultar em uma imagem menor.

Este exemplo acrescenta um serviço Web (httpd) a um recipiente e o configura para funcionar. Para começar, crie um contêiner de arranhões:

# buildah from scratch
working-container

Isto cria apenas um recipiente vazio (sem imagem) que você pode montar da seguinte forma:

# scratchmnt=$(buildah mount working-container)
# echo $scratchmnt
/var/lib/containers/storage/devicemapper/mnt/cc92011e9a2b077d03a97c0809f1f3e7fef0f29bdc6ab5e86b85430ec77b2bf6/rootfs

Inicializar um banco de dados RPM dentro da imagem raspada e adicionar o pacote redhat-release (que inclui outros arquivos necessários para que os RPMs funcionem):

# yum install -y --releasever=8 --installroot=$scratchmnt redhat-release

Instale o serviço httpd no diretório de raspadinhas:

# yum install -y --setopt=reposdir=/etc/yum.repos.d \
     --installroot=$scratchmnt \
     --setopt=cachedir=/var/cache/dnf httpd

Adicione algum texto a um arquivo index.html no recipiente, para que você possa testá-lo mais tarde:

# echo "Seu container httpd do zero funcionou" > $scratchmnt/var/wwww/html/index.html

Em vez de executar o httpd como um serviço init, defina algumas opções em buildah config para executar o daemon httpd diretamente do container:

# buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container
# buildah config --port 80/tcp working-container
# buildah commit working-container localhost/myhttpd:latest

Por enquanto, você pode usar o ID da imagem para executar a nova imagem como um recipiente com o comando podman:

# podman images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
localhost/myhttpd   latest              47c0795d7b0e        9 minutes ago       665.6 MB
# podman run -p 8080:80 -d --name httpd-server 47c0795d7b0e
# curl localhost:8080
Your httpd container from scratch worked.