Revise un Dockerfile con 55 reglas de hadolint: versiones fijadas, usuario root, caché y más
Se ejecuta en su navegador. Nada de lo que escribe se envía a ningún sitio. Comprobado el 16 de octubre de 2026.Un linter de Dockerfile lee el archivo sin construirlo y señala las líneas arriesgadas o derrochadoras. Este aplica 55 de las reglas DL de hadolint, como DL3008 para paquetes de apt-get sin versión fijada y DL3002 para ejecutar como root, y da a cada hallazgo su línea, su nivel y su solución. Funciona en su navegador, sin instalación y sin Docker.
Esta página se ha traducido automáticamente del original en inglés. Ninguna persona ha revisado todavía la traducción, así que la versión en inglés es la que debe consultar. Leer el original en inglés
Pegue el Dockerfile en el cuadro, abra el archivo o haga clic en Probar un ejemplo.
Lea los hallazgos, ordenados por línea: cada uno tiene un nivel, su código de hadolint, qué está mal y cómo corregirlo.
Haga clic en un hallazgo para ir a su línea, corríjalo y vea cómo la lista se actualiza mientras escribe.
Haga clic en Copiar informe para llevarse los hallazgos como texto, para un pull request o un ticket.
Un Dockerfile puede construirse hoy y fallar el mes que viene: una imagen base sin versión fijada cambia, un apt-get install toma una versión nueva, una caché que queda en una capa hace la imagen cientos de megabytes más grande. Un linter detecta esto antes de que llegue a producción. hadolint es el estándar en los pipelines de CI; esta página aplica sus reglas de Dockerfile en su navegador.
Qué revisa. Cada hallazgo indica su línea, su código de hadolint, un nivel y una solución de una línea. Las reglas se agrupan en cinco grupos:
| Grupo | Ejemplos |
|---|---|
| Builds reproducibles | DL3006 imagen sin etiqueta, DL3007 latest, DL3008 apt-get, DL3013 pip, DL3016 npm, DL3018 apk |
| Imágenes más pequeñas | DL3009 listas de apt, DL3015 recommends, DL3019 caché de apk, DL3042 caché de pip, DL3059 capas RUN de más |
| Seguridad | DL3002 usuario root, DL3004 sudo, DL4006 pipefail |
| Corrección | DL3011 rango de puertos, DL3021 destino de COPY, DL3022 y DL3023 nombres de etapa, DL3044 ENV, DL3061 orden |
| Intención clara | DL3000 WORKDIR, DL3003 cd, DL3020 ADD, DL3025 CMD en JSON, DL4000 MAINTAINER |
Qué tan cerca está de hadolint. Las reglas se escribieron a partir del código fuente de hadolint 2.12, y las pruebas usan las respuestas del programa hadolint real para más de 80 Dockerfiles: los mismos códigos en las mismas líneas, siempre. Los builds multietapa, ONBUILD, las líneas de continuación, la directiva escape y los comentarios # hadolint ignore= en línea se comportan como en hadolint. No se incluyen las advertencias SC de ShellCheck sobre el código de shell dentro de las líneas RUN.
Desactivar una regla. Ponga # hadolint ignore=DL3008 en la línea anterior a una instrucción para omitir esa regla ahí, o # hadolint global ignore=DL3059 en cualquier lugar para omitirla en todo el archivo. El resumen indica cuántos hallazgos se desactivaron.
Todo funciona en su navegador: el Dockerfile que pega o abre nunca se sube.
DL3008 indica que una línea apt-get install nombra paquetes sin versión, así que cada build puede instalar algo distinto. Escriba paquete=versión, como curl=7.88.1-10+deb12u5, y busque la versión actual con apt-cache policy curl dentro de la imagen base. Fijar versiones hace la imagen reproducible; actualice las versiones a propósito, no por accidente.
Un contenedor que se ejecuta como root tiene derechos de root dentro de él, así que un atacante que entre en la aplicación puede hacer más, y un error en un volumen montado puede cambiar archivos del host. Cree un usuario en un RUN, como useradd app, y termine la etapa con USER app. Los pasos de build anteriores pueden seguir ejecutándose como root.
Cada RUN crea una capa, y un archivo eliminado en una capa posterior sigue ocupando espacio en la anterior. apt-get update descarga listas de paquetes de decenas de megabytes, así que elimínelas en el mismo RUN con && rm -rf /var/lib/apt/lists/*. Eliminarlas en un RUN aparte no ahorra nada.
Escriba un comentario justo encima de la instrucción: # hadolint ignore=DL3008, o varios códigos separados por comas. Para desactivar una regla en todo el archivo, escriba # hadolint global ignore=DL3059 en cualquier lugar. Ambos funcionan en hadolint y en esta página, y el resumen cuenta lo que se desactivó.
Para las reglas de Dockerfile, sí: los 55 códigos DL, sus niveles y sus condiciones siguen a hadolint 2.12, y las pruebas comparan con el programa hadolint real en más de 80 archivos. No se incluyen las advertencias SC de ShellCheck sobre el código de shell dentro de las líneas RUN, ni las reglas que necesitan un archivo de configuración, como los registros permitidos.
Use COPY para archivos y carpetas. ADD además descarga URL y descomprime archivos tar locales, lo que es útil cuando quiere exactamente eso y sorprendente cuando no. hadolint señala ADD para un archivo simple como DL3020, y un COPY seguido de tar -x del mismo archivo como DL3010, donde ADD lo haría en un solo paso.
Los tipos y las normas cambian; consulte la fuente antes de fiarse de una cifra.
¿Sigue sin resolverlo? Pregunte sobre Linter de Dockerfile y cualquiera que lo sepa puede responder. No se necesita cuenta.