Usando Podman con Quarkus: la configuración esencial

Quarkus y Podman son una gran combinación para el desarrollo moderno. Sin embargo, hay un detalle poco visible que puede generar confusiones o errores, especialmente al trabajar con Dev Services o Testcontainers.

El problema: la forma en que Quarkus se conecta al motor de contenedores.

A diferencia de Docker, Podman requiere que especifiques explícitamente el socket a utilizar. Además, en algunos entornos es necesario desactivar un componente llamado Ryuk. Si nunca escuchaste hablar de Ryuk, no estás solo. Muchos desarrolladores (incluso con experiencia en Quarkus) descubren este tema recién cuando las pruebas fallan sin razón aparente.

En esta guía te mostramos cómo configurar correctamente tu entorno para que todo funcione desde el primer quarkus dev.


🦭 ¿Qué es Podman?

Podman es un motor de contenedores de código abierto con dos características distintivas:

  • Daemonless: No requiere un proceso central corriendo en segundo plano (a diferencia de Docker).
  • Rootless: Puede ejecutar contenedores sin privilegios de administrador.

Funciona en Linux, Windows y macOS, y es compatible con imágenes OCI (el mismo estándar que usa Docker).

Instalación recomendada

La forma más sencilla de instalar Podman es a través de Podman Desktop, que incluye tanto el motor como una interfaz gráfica para gestionar contenedores.

👉 Descargar Podman Desktop

⚠️ En macOS: Se recomienda NO usar Homebrew para instalar Podman, ya que puede generar combinaciones de componentes no verificadas.


⚙️ Variables de entorno necesarias

Para que Quarkus, Dev Services y Testcontainers funcionen correctamente con Podman, necesitas configurar estas variables de entorno:

VariablePropósito
DOCKER_HOSTIndica la ubicación del socket de Podman. El valor depende del sistema operativo (ver secciones más abajo).
TESTCONTAINERS_RYUK_DISABLED=trueDesactiva Ryuk, un contenedor auxiliar de limpieza que no funciona bien con Podman.

Además, crea el archivo ~/.testcontainers.properties con:

PropiedadPropósito
docker.hostMisma ubicación del socket que DOCKER_HOST.
testcontainers.reuse.enableControla si los contenedores se reutilizan entre reinicios (ver nota).

💡 Sobre testcontainers.reuse.enable: Con true, el mismo contenedor se reutiliza entre reinicios de tu aplicación, acelerando el ciclo de desarrollo. El valor por defecto es false, por lo que no necesitas declararlo si prefieres un contenedor nuevo en cada ejecución. Ten en cuenta que la reutilización solo aplica si el contenedor sigue corriendo: si lo detienes con podman stop, se creará uno nuevo (a menos que lo levantes manualmente antes de ejecutar tu aplicación).


🖥️ Configurando DOCKER_HOST por sistema operativo

🐧 Linux

Antes de configurar, necesitas saber en qué modo está corriendo tu Podman.

¿Rootless o rootful?

Modo¿Qué significa?¿Cuándo se usa?
RootlessLos contenedores corrensin privilegios de root . Más seguro.Es el modo predeterminado en la mayoría de instalaciones modernas.
RootfulLos contenedores correncon privilegios de root . Acceso completo al sistema.Usado en servidores o cuando se necesita acceso a recursos del sistema.

¿Cómo sé cuál estoy usando?

Ejecuta este comando:

podman info --format '{{.Host.Security.Rootless}}'
  • Si devuelve true: Estás en modo rootless
  • Si devuelve false: Estás en modo rootful

💡 Si no estás seguro, probablemente estés en modo rootless. Es el más común para desarrollo.

Modo rootless

Esta es la configuración más común. El socket de Podman no está en la ubicación estándar de Docker, por lo que hay que declararlo explícitamente.

1. Agrega a tu archivo de entorno (~/.bashrc o ~/.zshrc):

export DOCKER_HOST="unix://${XDG_RUNTIME_DIR}/podman/podman.sock"
export TESTCONTAINERS_RYUK_DISABLED=true

2. Crea o edita ~/.testcontainers.properties:

docker.host=unix://${XDG_RUNTIME_DIR}/podman/podman.sock
testcontainers.reuse.enable=true

3. Recarga tu shell:

source ~/.bashrc  # o ~/.zshrc

Modo rootful

Si confirmaste que estás en modo rootful, verifica que el socket de compatibilidad Docker esté disponible:

ls -l /var/run/docker.sock
  • ✅ Si el archivo existe y apunta a podman.sock: Usa la configuración de esta sección.
  • ❌ Si NO existe: Habilítalo con sudo systemctl enable --now podman.socket, o usa la configuración rootless.

1. Agrega a tu archivo de entorno:

export DOCKER_HOST="unix:///var/run/podman.sock"
export TESTCONTAINERS_RYUK_DISABLED=true

2. Crea o edita ~/.testcontainers.properties:

docker.host=unix:///var/run/podman.sock
testcontainers.reuse.enable=true

🍎 macOS

En macOS, Podman corre dentro de una máquina virtual. El socket está dentro de esa VM, y hay que indicar su ubicación exacta.

💡 Recomendación: No dependas de /var/run/docker.sock. Configura DOCKER_HOST explícitamente para evitar ambigüedades.

1. Agrega a tu archivo de entorno (~/.zshrc):

export DOCKER_HOST="unix://$(podman machine inspect --format '{{.ConnectionInfo.PodmanSocket.Path}}')"
export TESTCONTAINERS_RYUK_DISABLED=true

2. Crea o edita ~/.testcontainers.properties:

docker.host=unix://$(podman machine inspect --format '{{.ConnectionInfo.PodmanSocket.Path}}')
testcontainers.reuse.enable=true

3. Recarga tu shell:

source ~/.zshrc

🪟 Windows

En Windows, Podman corre dentro de una máquina virtual basada en WSL2 (Windows Subsystem for Linux). Podman Desktop se encarga de crear y gestionar esta VM automáticamente.

Requisitos previos:

  • Windows 10/11 con WSL2 habilitado
  • Podman Desktop instalado desde podman-desktop.io

1. Inicia Podman Desktop y asegúrate de que la máquina Podman esté corriendo (verás un indicador verde).

2. Configura las variables de entorno del sistema:

Abre PowerShell como administrador y ejecuta:

[System.Environment]::SetEnvironmentVariable("DOCKER_HOST", "npipe:////./pipe/podman-machine-default", "User")
[System.Environment]::SetEnvironmentVariable("TESTCONTAINERS_RYUK_DISABLED", "true", "User")

3. Crea el archivo de configuración de Testcontainers:

En tu carpeta de usuario (C:\Users\TuUsuario\), crea un archivo llamado .testcontainers.properties con este contenido:

docker.host=npipe:////./pipe/podman-machine-default<br>testcontainers.reuse.enable=true

4. Reinicia tu terminal o IDE para que las variables de entorno tomen efecto.


✅ Verificar que todo funciona

La mejor forma de probar la configuración es crear una aplicación con una extensión que use Dev Services:

quarkus create app podman-test -x oidc
cd podman-test
quarkus dev

Al ejecutar quarkus dev, Dev Services debería:

  1. Descargar la imagen de Keycloak
  2. Levantar un contenedor automáticamente
  3. Configurar tu aplicación para usarlo

Si ves Keycloak iniciando en los logs, ¡tu configuración está correcta! 🎉


🧭 Resumen rápido por sistema operativo

SistemaDOCKER_HOST
Linux (rootless)unix://${XDG_RUNTIME_DIR}/podman/podman.sock
Linux (rootful)unix:///var/run/podman.sock
macOSunix://$(podman machine inspect --format '{{.ConnectionInfo.PodmanSocket.Path}}')
Windowsnpipe:////./pipe/podman-machine-default

En todos los casos, agrega también:

export TESTCONTAINERS_RYUK_DISABLED=true

🚀 Conclusión

Con unas pocas líneas de configuración, puedes dejar tu entorno de desarrollo con Quarkus y Podman listo para despegar.

Lo mejor: evitas errores difíciles de rastrear que muchas veces se atribuyen al framework, cuando en realidad son producto de una integración no del todo ajustada.

¡Buen viaje! 🚀