The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Configuração do Podman para os Quarkus Dev Services e Testcontainers no Linux

Atualização: Para obter as instruções mais recentes e mais simples sobre como executar o Podman com o Quarkus, consulte o guia do Quarkus Podman.

O Podman é um mecanismo de contêiner sem daemon para desenvolver, gerenciar e executar contêineres em sistemas Linux. Desde o lançamento da versão 3, o Podman permite que o usuário execute um serviço emulando uma API do Docker fornecida via um soquete Unix. Isso possibilita que o Testcontainers e o Quarkus Dev Services sejam utilizados com o Podman.

As instruções deste artigo não funcionam no macOS e no Microsoft Windows.

Requisitos

  • Executando em um sistema Linux com o Podman 3.x instalado.

  • podman-docker instalado para emular o Docker CLI para o Quarkus Dev Services.

  • (Opcional) podman-remote instalado para etapas de verificação.

Configuração

TL;DR

Os comandos a seguir configurarão o Podman e as variáveis de ambiente para trabalhar com o Quarkus Dev Services e o Testcontainers:

# Install the required podman packages from dnf. If you're not using rpm based
# distro, replace with respective package manager
sudo dnf install podman podman-docker
# Enable the podman socket with Docker REST API
systemctl --user enable podman.socket --now
# Set the required envvars
export DOCKER_HOST=unix:///run/user/${UID}/podman/podman.sock
export TESTCONTAINERS_RYUK_DISABLED=true

O que esta configuração faz é explicado abaixo, juntamente com a resolução básica de problemas.

Configuração do serviço Podman

O Podman é um mecanismo de contêiner sem daemon. O Quarkus Dev Services e o Testcontainers esperam um daemon do Docker em execução escutando em um soquete Unix. Desde a versão 3, o Podman pode ser configurado para criar um serviço que escutando em um soquete Unix que pode ser usado com Dev Services e Testcontainers.

Por convenção, os clientes do Docker tentam se conectar ao serviço especificado pela URL configurada na variável de ambiente DOCKER_HOST , portanto, essa variável precisa ser configurada para apontar para o soquete Unix no qual o serviço Podman estará escutando:

export DOCKER_HOST=unix:///run/user/${UID}/podman/podman.sock

Essa configuração será aplicada somente à sessão atual do terminal. Para tornar essa configuração persistente, adicione a linha aos arquivos de perfil do seu shell (por exemplo, ~/.profile ).

O Testcontainers e o Quarkus Dev Services também esperam que o serviço de contêiner ao qual fazem solicitações seja não interativo. Caso tenha vários registros configurados na sua configuração do Docker ou do Podman, o Podman responde com um prompt perguntando qual registro deve ser usado para extrair contêineres, caso os contêineres extraídos sejam especificados por um nome curto.

Vocêr pode desativar esse prompt definindo a propriedade de configuração short-name-mode="disabled" do Podman em /etc/containers/registries.conf.

Essa configuração é sensível à segurança. Consulte Nomes curtos de imagens de contêineres no Podman antes de alterar essa configuração.

Por fim, vamos iniciar o serviço do Podman escutando no soquete especificado anteriormente pela variável de ambiente DOCKER_HOST.

O Podman é distribuído com unidades systemd locais do usuário nos gerenciadores de pacotes apt e dnf configurados para executar um serviço Podman sem root. Isso significa que o processo do Podman será iniciado somente com os privilégios do usuário no qual você está conectado, que os contêineres e a configuração são armazenados no seu diretório pessoal e que esse serviço escuta em unix:///run/user/${UID}/podman/podman.sock. Na maioria das distribuições Linux, você pode ativar esse serviço com o seguinte comando:

systemctl --user enable podman.socket --now

Você pode verificar se o serviço de contêiner está realmente em execução e respondendo na URI especificada por DOCKER_HOST com podman-remote.

podman-remote info

No momento, o suporte do Podman para o contêiner Ryuk não está funcionando corretamente. O Ryuk é um contêiner que o Testcontainers usa para limpar todos os contêineres gerados pelo Testcontainers após o término de seu uso no código Java. Você pode configurar o Testcontainers para não usar o Ryuk.

export TESTCONTAINERS_RYUK_DISABLED=true

Essa configuração será aplicada somente à sessão atual do terminal. Para tornar essa configuração persistente, adicione a linha aos arquivos de perfil do seu shell (por exemplo, ~/.profile ).

O Podman agora está disponível para responder ao cliente Java Docker usado no Testcontainers. Observe que o Quarkus Dev Services exige que o comando docker esteja disponível em PATH. O pacote podman-docker nas distribuições Linux fornece uma camada de emulação de CLI do Docker para o Podman.

As futuras versões do Quarkus removerão a exigência do comando docker disponível em PATH.

Migrando do Docker

Se você já estava executando o Docker em uma versão que não suportava o cgroups V2 em distribuições Linux modernas, era necessário ativar uma solução alternativa para definir o cgroups como V1. Isso se aplicava às versões do Docker anteriores à 19, inclusive.

Você pode verificar se a solução alternativa foi previamente aplicada ao seu sistema com o seguinte comando:

sudo grubby --info=ALL | grep "systemd.unified_cgroup_hierarchy=0"

Se a saída estiver presente, isso significa que o argumento do kernel para definir cgroups como V1 foi aplicado. Você pode remover o argumento do kernel com o seguinte comando, reativando o cgroups V2:

sudo grubby --update-kernel=ALL --remove-args="systemd.unified_cgroup_hierarchy=0"

Esta configuração só terá efeito após uma reinicialização.