Verificación de la configuración de compilación
Las verificaciones de compilación (build checks) son una característica introducida en Dockerfile 1.8. Te permiten validar tu configuración de compilación y realizar una serie de verificaciones antes de ejecutar tu compilación. Piensa en ello como una forma avanzada de análisis estático (linting) para tu Dockerfile y opciones de compilación, o un modo de prueba (dry-run) para las compilaciones.
Puedes encontrar la lista de verificaciones disponibles y una descripción de cada una en la referencia de verificaciones de compilación.
Cómo funcionan las verificaciones de compilación
Normalmente, cuando ejecutas una compilación, Docker ejecuta los pasos de compilación en tu Dockerfile y las opciones de compilación tal como se especifican. Con las verificaciones de compilación, en lugar de ejecutar los pasos de compilación, Docker verifica el Dockerfile y las opciones que proporcionas e informa sobre cualquier problema que detecte.
Las verificaciones de compilación son útiles para:
- Validar tu Dockerfile y las opciones de compilación antes de ejecutar una compilación.
- Asegurar que tu Dockerfile y las opciones de compilación estén actualizados con las últimas buenas prácticas.
- Identificar posibles problemas o antipatrones en tu Dockerfile y opciones de compilación.
TipPara mejorar el análisis estático, la navegación de código y el escaneo de vulnerabilidades de tus Dockerfiles en Visual Studio Code, consulta la extensión Docker DX.
Compilar con verificaciones
Las verificaciones de compilación son compatibles con:
- Buildx versión 0.15.0 y posteriores
- docker/build-push-action versión 6.6.0 y posteriores
- docker/bake-action versión 5.6.0 y posteriores
Invocar una compilación ejecuta las verificaciones por defecto y muestra cualquier violación en la salida de compilación. Por ejemplo, el siguiente comando compila la imagen y ejecuta las verificaciones:
$ docker build .
[+] Building 3.5s (11/11) FINISHED
...
1 warning found (use --debug to expand):
- Lint Rule 'JSONArgsRecommended': JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 7)
En este ejemplo, la compilación se ejecutó con éxito, pero se informó una advertencia
JSONArgsRecommended, ya que
las instrucciones CMD deben usar la sintaxis de array JSON.
Con GitHub Actions, las verificaciones se muestran en la vista de diferencias (diff) de las pull requests.
name: Build and push Docker images
on:
push:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Build and push
uses: docker/build-push-action@v7

Salida más detallada
Las advertencias de verificación para un docker build normal muestran un mensaje conciso
que contiene el nombre de la regla, el mensaje y el número de línea en el Dockerfile
de donde se originó el problema. Si deseas ver información más detallada
sobre las verificaciones, puedes usar la bandera (flag) --debug. Por ejemplo:
$ docker --debug build .
[+] Building 3.5s (11/11) FINISHED
...
1 warning found:
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 4)
JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals
More info: https://docs-docker.esdocu.com/go/dockerfile/rule/json-args-recommended/
Dockerfile:4
--------------------
2 |
3 | FROM alpine
4 | >>> CMD echo "Hello, world!"
5 |
--------------------
Con la bandera --debug, la salida incluye un enlace a la documentación para
la verificación y un fragmento del Dockerfile donde se encontró el problema.
Verificar una compilación sin compilar
Para ejecutar verificaciones de compilación sin realizar la compilación real, puedes usar el comando docker build
como lo harías normalmente, pero añadiendo la bandera --check. Aquí tienes un ejemplo:
$ docker build --check .
En lugar de ejecutar los pasos de compilación, este comando solo ejecuta las verificaciones e informa sobre cualquier problema que encuentre. Si hay algún problema, se informará en la salida. Por ejemplo:
[+] Building 1.5s (5/5) FINISHED
=> [internal] connecting to local controller
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 253B
=> [internal] load metadata for docker.io/library/node:22
=> [auth] library/node:pull token for registry-1.docker.io
=> [internal] load .dockerignore
=> => transferring context: 50B
JSONArgsRecommended - https://docs-docker.esdocu.com/go/dockerfile/rule/json-args-recommended/
JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals
Dockerfile:7
--------------------
5 |
6 | COPY index.js .
7 | >>> CMD node index.js
8 |
--------------------Esta salida con --check muestra el mensaje detallado
de la verificación.
A diferencia de una compilación normal, si se informa alguna violación al usar la bandera --check,
el comando finaliza con un código de estado distinto de cero.
Fallar la compilación por violaciones de verificación
Las violaciones de verificación para las compilaciones se informan como advertencias, con código de salida 0, por
defecto. Puedes configurar Docker para que falle la compilación cuando se informen violaciones,
utilizando una directiva check=error=true en tu Dockerfile. Esto hará que
la compilación falle con un error después de que se ejecuten las verificaciones de compilación, antes de que se
ejecute la compilación real.
| |
Sin la directiva # check=error=true, esta compilación se completaría con un
código de salida 0. Sin embargo, con la directiva, la violación de la verificación de compilación da como
resultado un código de salida distinto de cero:
$ docker build .
[+] Building 1.5s (5/5) FINISHED
...
1 warning found (use --debug to expand):
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 5)
Dockerfile:1
--------------------
1 | >>> # syntax=docker/dockerfile:1
2 | # check=error=true
3 |
--------------------
ERROR: lint violation found for rules: JSONArgsRecommended
$ echo $?
1
También puedes establecer la directiva de error en la CLI pasando el
argumento de compilación BUILDKIT_DOCKERFILE_CHECK:
$ docker build --check --build-arg "BUILDKIT_DOCKERFILE_CHECK=error=true" .
Omitir verificaciones
Por defecto, todas las verificaciones se ejecutan cuando compilas una imagen. Si deseas omitir
verificaciones específicas, puedes usar la directiva check=skip en tu Dockerfile.
El parámetro skip acepta una lista de IDs de verificación separados por comas que deseas omitir.
Por ejemplo:
# syntax=docker/dockerfile:1
# check=skip=JSONArgsRecommended,StageNameCasing
FROM alpine AS BASE_STAGE
CMD echo "Hello, world!"Compilar este Dockerfile no genera violaciones de verificación.
También puedes omitir verificaciones pasando el argumento de compilación BUILDKIT_DOCKERFILE_CHECK
con una lista de IDs de verificación separados por comas. Por ejemplo:
$ docker build --check --build-arg "BUILDKIT_DOCKERFILE_CHECK=skip=JSONArgsRecommended,StageNameCasing" .
Para omitir todas las verificaciones, utiliza el parámetro skip=all:
# syntax=docker/dockerfile:1
# check=skip=allCombinar parámetros de error y omisión para directivas de verificación
Para omitir verificaciones específicas y al mismo tiempo fallar en caso de violaciones, pasa los
parámetros skip y error separados por un punto y coma (;) a la directiva check
en tu Dockerfile o en un argumento de compilación. Por ejemplo:
# syntax=docker/dockerfile:1
# check=skip=JSONArgsRecommended,StageNameCasing;error=true$ docker build --check --build-arg "BUILDKIT_DOCKERFILE_CHECK=skip=JSONArgsRecommended,StageNameCasing;error=true" .
Verificaciones experimentales
Antes de que las verificaciones pasen a ser estables, pueden estar disponibles como verificaciones experimentales. Las verificaciones experimentales están deshabilitadas por defecto. Para ver la lista de verificaciones experimentales disponibles, consulta la referencia de verificaciones de compilación.
Para habilitar todas las verificaciones experimentales, establece el argumento de compilación BUILDKIT_DOCKERFILE_CHECK
en experimental=all:
$ docker build --check --build-arg "BUILDKIT_DOCKERFILE_CHECK=experimental=all" .
También puedes habilitar verificaciones experimentales en tu Dockerfile usando la directiva check:
# syntax=docker/dockerfile:1
# check=experimental=allPara habilitar selectivamente las verificaciones experimentales, puedes pasar una lista de los
IDs de verificación que deseas habilitar, ya sea en la directiva check de tu Dockerfile
o como un argumento de compilación. Por ejemplo:
# syntax=docker/dockerfile:1
# check=experimental=JSONArgsRecommended,StageNameCasingTen en cuenta que la directiva experimental tiene prioridad sobre la directiva skip,
lo que significa que las verificaciones experimentales se ejecutarán independientemente de la directiva skip
que hayas establecido. Por ejemplo, si estableces skip=all y habilitas las
verificaciones experimentales, las verificaciones experimentales se seguirán ejecutando:
# syntax=docker/dockerfile:1
# check=skip=all;experimental=allLectura adicional
Para obtener más información sobre el uso de verificaciones de compilación, consulta: