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-dockerinstalado para emular o Docker CLI para o Quarkus Dev Services. -
(Opcional)
podman-remoteinstalado 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, |
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, |
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.