Inicio › Herramientas para desarrolladores › Linter de Dockerfile

Linter de Dockerfile

Pega un Dockerfile y obtén una revisión instantánea según 38 reglas de buenas prácticas: imágenes base sin fijar o con latest, apt-get update en su propia capa, cachés de paquetes sobrantes, falta de USER sin root, CMD en forma shell, secretos en ENV y más. Cada hallazgo enlaza a su línea y explica por qué importa y cómo corregirlo.

Última actualización:

Reglas (0 activadas)

Desmarca una regla para ignorarla. Tu elección se recuerda en este navegador. También puedes añadir # lint-ignore: DF201 en la línea anterior a una instrucción.

–
Pega un Dockerfile
    Publicidad
    Publicidad

    Cómo usar Linter de Dockerfile

    1. Pega tu Dockerfile en el editor, súbelo o carga uno de los ejemplos.
    2. Lee la puntuación y el recuento de errores, advertencias y sugerencias; las tarjetas de etapa muestran cuántas capas crea cada etapa.
    3. Abre cada hallazgo: haz clic en el número de línea para saltar a ella y despliega Por qué importa para ver el razonamiento y un ejemplo corregido.
    4. Corrige y vuelve a comprobar: el Dockerfile se analiza de nuevo mientras escribes.
    5. Ajusta las reglas si alguna comprobación no encaja con tu proyecto y luego copia el informe para una revisión de código o un ticket.

    Referencia de reglas

    Las reglas se agrupan por gravedad. Los errores rompen la compilación o se comportan de forma distinta a lo previsto, las advertencias afectan a la seguridad, el tamaño o la reproducibilidad, y las sugerencias son buenos hábitos.

    CódigoReglaCorrección habitual
    DF101FROM debe ser la primera instrucciónSolo ARG puede ir antes de FROM
    DF102Instrucción desconocidaCorrige la errata o restaura la \ que falta en la línea anterior
    DF103JSON no válido en forma execCMD ["npm", "start"] con comillas dobles
    DF104 / DF105Nombre de etapa duplicado / COPY --from desconocidoAS nombre único; haz referencia solo a etapas anteriores
    DF106Varios orígenes necesitan un directorio de destinoCOPY a.txt b.txt ./
    DF107 / DF108Puerto EXPOSE no válido / WORKDIR relativoEXPOSE 8080, WORKDIR /app
    DF201 / DF202Imagen base sin fijar o con :latestFROM python:3.12-slim
    DF203El contenedor se ejecuta como rootUSER app en la etapa final
    DF204 – DF208apt-get: update con install, limpieza de caché, -y, apt frente a apt-get, sin upgradeapt-get update && apt-get install -y --no-install-recommends … && rm -rf /var/lib/apt/lists/*
    DF209 / DF210Cachés de apk y yum/dnfapk add --no-cache, dnf clean all
    DF211 / DF216sudo, chmod 777Cambios con USER, COPY --chown
    DF212 / DF313ADD para archivos locales, URL sin verificarCOPY; ADD --checksum=sha256:…
    DF213Más de un CMD o ENTRYPOINTConserva solo el último
    DF214MAINTAINER está obsoletoLABEL org.opencontainers.image.authors=…
    DF215Secreto en ENV o ARGVariables en tiempo de ejecución o RUN --mount=type=secret
    DF217Línea vacía en una continuaciónElimina la línea en blanco
    DF301 – DF313Sugerencias: no-install-recommends, caché de pip, WORKDIR frente a cd, forma exec, RUN combinados, orden de COPY favorable a la caché, pipefail, ENV clave=valor, mayúsculas, HEALTHCHECK, npm ci, número de capasConsulta la explicación bajo cada hallazgo

    Una estructura de Dockerfile favorable a la caché

    Docker vuelve a compilar una capa cuando cambia la instrucción o los archivos que copia, y también todas las capas posteriores. Ordena las instrucciones de la que menos cambia a la que más:

    1. Imagen base con una etiqueta fijada, y paquetes del sistema instalados y limpiados en un único RUN.
    2. Solo los manifiestos de dependencias: package.json y package-lock.json, requirements.txt, go.mod y go.sum.
    3. Instalación de dependencias: npm ci, pip install --no-cache-dir -r requirements.txt, go mod download.
    4. Código fuente: COPY . ., con un .dockerignore que excluya .git, node_modules y los resultados de compilación.
    5. Paso de compilación, idealmente en una etapa separada, y luego copia solo el resultado a una imagen de ejecución pequeña.
    6. Ajustes de ejecución: USER, EXPOSE, HEALTHCHECK y un CMD o ENTRYPOINT en forma exec.

    Con este orden, editar un archivo fuente reutiliza las capas de dependencias en caché y la recompilación tarda segundos en lugar de minutos.

    Preguntas frecuentes

    ¿Qué comprueba un linter de Dockerfile?

    Lee cada instrucción y la compara con las prácticas de Dockerfile más recomendadas: imágenes base reproducibles (etiquetas fijadas), capas pequeñas (cachés de paquetes eliminadas en el mismo RUN), seguridad (un usuario sin root, sin secretos en ENV, sin chmod 777), sintaxis correcta (JSON válido en forma exec, instrucciones conocidas, puertos EXPOSE válidos) y eficiencia de la caché de compilación (archivos de dependencias copiados antes que el código fuente).

    ¿Por qué apt-get update y apt-get install deben ir en el mismo RUN?

    Docker guarda en caché cada instrucción RUN como una capa. Si apt-get update tiene su propio RUN, esa capa se reutiliza en compilaciones posteriores incluso después de añadir paquetes a la línea de instalación, así que apt-get trabaja con listas de paquetes antiguas y puede fallar o instalar versiones desactualizadas. Poner ambos en un único RUN, seguido de rm -rf /var/lib/apt/lists/*, actualiza las listas y las elimina en la misma capa.

    ¿Por qué el linter quiere una instrucción USER?

    Salvo que un Dockerfile defina USER, el proceso del contenedor se ejecuta como root. Si la aplicación se ve comprometida, ser root dentro del contenedor facilita escapar al host o manipular los archivos montados. Crea un usuario sin privilegios, instala primero los paquetes y luego cambia con USER en la etapa final.

    ¿Cuál es la diferencia entre la forma shell y la forma exec?

    La forma shell (CMD python app.py) ejecuta el comando a través de /bin/sh -c, así que tu programa es hijo del shell y no recibe SIGTERM cuando el contenedor se detiene; Docker espera 10 segundos y luego lo mata. La forma exec (CMD ["python", "app.py"]) inicia el programa directamente como PID 1, para que pueda cerrarse limpiamente.

    ¿Cuántas capas son demasiadas?

    Docker admite hasta 127 capas en una imagen, pero mucho antes de eso, muchas capas hacen que las descargas sean más lentas y las imágenes más difíciles de inspeccionar. Solo RUN, COPY y ADD añaden capas al sistema de archivos. El linter sugiere combinar instrucciones RUN consecutivas e informa de la etapa final cuando crea más de 15 capas. Las compilaciones multietapa son lo que más ayuda, porque solo la etapa final acaba en la imagen.

    ¿Es lo mismo que hadolint?

    No. Este es un linter independiente que funciona en el navegador, con su propio conjunto de reglas (códigos DF101 a DF313) inspirado en la guía oficial de buenas prácticas de Docker. No ejecuta ShellCheck sobre los comandos RUN. Para pipelines de CI, un linter de línea de comandos es un buen complemento; esta herramienta es práctica para revisiones rápidas y para aprender por qué existe cada regla.

    ¿Puedo ignorar una regla en una línea?

    Sí. Pon un comentario como # lint-ignore: DF201 en la línea justo encima de la instrucción para omitir esa regla allí, o desmarca la regla en la lista de Reglas para desactivarla en todas partes. La lista de reglas se recuerda en tu navegador.

    ¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

    Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

    Herramientas relacionadas

    Ver todas las de Generadores de código →