Depuración de políticas de compilación
Cuando las políticas no funcionen como se espera, utiliza las herramientas disponibles para inspeccionar la evaluación de la política y comprender qué está sucediendo. Esta guía cubre las técnicas de depuración y las situaciones comunes (gotchas).
Referencia rápida
Comandos esenciales de depuración:
# Ver todos los datos de entrada durante las compilaciones (recomendado)
$ docker buildx build --progress=plain --policy log-level=debug .
# Ver las verificaciones y decisiones de políticas
$ docker buildx build --progress=plain .
# Explorar la estructura de entrada para diferentes fuentes
$ docker buildx policy eval --print .
$ docker buildx policy eval --print https://github.com/org/repo.git
$ docker buildx policy eval --print docker-image://alpine:3.19
# Probar si una política permite una fuente
$ docker buildx policy eval .
Salida de políticas con --progress=plain
Para ver la evaluación de políticas durante las compilaciones, utiliza --progress=plain:
$ docker buildx build --progress=plain .
Esto muestra todas las verificaciones de políticas, decisiones y la salida de
print(). Sin --progress=plain, la evaluación de políticas es silenciosa a
menos que ocurra un error.
#1 loading policies Dockerfile.rego
#1 0.010 checking policy for source docker-image://alpine:3.19 (linux/arm64)
#1 0.011 Dockerfile.rego:8: image: {"ref":"alpine:3.19","repo":"alpine","tag":"3.19"}
#1 0.012 policy decision for source docker-image://alpine:3.19: ALLOWSi una política deniega una fuente, verás:
#1 0.012 policy decision for source docker-image://nginx:latest: DENY
ERROR: source "docker-image://nginx:latest" not allowed by policyLogs de depuración
Para una depuración detallada, añade --policy log-level=debug para ver el JSON
de entrada completo, los campos no resueltos y las respuestas de la política:
$ docker buildx build --progress=plain --policy log-level=debug .
Esto muestra significativamente más información que el nivel por defecto,
incluyendo la estructura de entrada completa para cada fuente sin necesidad de
sentencias print() en tu política.
JSON de entrada completo:
#1 0.007 policy input: {
#1 0.007 "env": {
#1 0.007 "filename": "."
#1 0.007 },
#1 0.007 "image": {
#1 0.007 "ref": "docker.io/library/alpine:3.19",
#1 0.007 "host": "docker.io",
#1 0.007 "repo": "alpine",
#1 0.007 "fullRepo": "docker.io/library/alpine",
#1 0.007 "tag": "3.19",
#1 0.007 "platform": "linux/arm64",
#1 0.007 "os": "linux",
#1 0.007 "arch": "arm64"
#1 0.007 }
#1 0.007 }Campos no resueltos:
#1 0.007 unknowns for policy evaluation: [input.image.checksum input.image.labels input.image.user input.image.volumes input.image.workingDir input.image.env input.image.hasProvenance input.image.signatures]Respuesta de la política:
#1 0.008 policy response: map[allow:true]Esta salida detallada es de gran valor para entender exactamente qué datos recibe
tu política y qué campos aún no se han resuelto. Utiliza los logs de depuración
al desarrollar políticas para evitar tener que recurrir a múltiples sentencias
print().
Depuración condicional con print()
Aunque --policy log-level=debug muestra todos los datos de entrada
automáticamente, la función print() es útil para depurar lógica de reglas
específica y flujos condicionales:
allow if {
input.image
print("Checking image:", input.image.repo, "isCanonical:", input.image.isCanonical)
input.image.repo == "alpine"
input.image.isCanonical
}Utiliza print() para depurar la lógica condicional dentro de las reglas o
rastrear qué reglas se están evaluando. Para una inspección general de las
entradas durante el desarrollo, utiliza --policy log-level=debug en su lugar;
no requiere modificar la política.
NoteLas sentencias print solo se ejecutan cuando se evalúa la regla que las contiene. Una regla como
allow if { input.image; print(...) }solo imprime para entradas de imágenes, no para repositorios Git, descargas HTTP o archivos locales.
Problemas comunes
Ruta completa del repositorio o nombre del repositorio
Síntoma: La verificación de los nombres de repositorio en la política no coincide como se esperaba.
Causa: Las imágenes de Docker Hub usan input.image.repo para el nombre corto
("alpine"), pero input.image.fullRepo incluye la ruta completa
("docker.io/library/alpine").
Solución:
# Coincidir solo con el nombre del repositorio (funciona para Docker Hub y otros registros)
allow if {
input.image
input.image.repo == "alpine"
}
# O coincidir con la ruta completa del repositorio
allow if {
input.image
input.image.fullRepo == "docker.io/library/alpine"
}La evaluación de la política ocurre múltiples veces
Síntoma: La salida de la compilación muestra la misma fuente evaluada múltiples veces.
Causa: BuildKit puede evaluar políticas en diferentes etapas (resolución de referencias, descarga real) o para diferentes plataformas.
Este comportamiento es normal. Las políticas deben ser idempotentes (producir el mismo resultado cada vez para la misma entrada).
Faltan campos con policy eval --print
Síntoma: docker buildx policy eval --print no muestra los campos esperados como
hasProvenance, labels o checksum.
Causa: --print muestra solo información de referencia por defecto, sin
realizar consultas a los registros.
Solución: Utiliza --fields para obtener campos de metadatos específicos:
$ docker buildx policy eval --print --fields image.labels docker-image://alpine:3.19
Consulta Uso de políticas de compilación para más detalles.
Siguientes pasos
- Ver la referencia de campos completa: Referencia de inputs
- Revisar ejemplos de políticas: Ejemplos
- Aprender patrones de uso de políticas: Uso de políticas de compilación