
Un enlace Dockerfile más inteligente que lo ayuda a construir imágenes de Docker de mejores prácticas. El Linter analiza el Dockerfile en un AST y realiza reglas sobre el AST. Se encuentra sobre los hombros de Shellcheck para vincular el código BASH dentro de las instrucciones de RUN .
Consulte la versión en línea en hadolint.github.io/hadolint 
Puede ejecutar hadolint localmente para pelear su Dockerfile.
hadolint < Dockerfile >
hadolint --ignore DL3003 --ignore DL3006 < Dockerfile > # exclude specific rules
hadolint --trusted-registry my-company.com:500 < Dockerfile > # Warn when using untrusted FROM images Docker viene al rescate, proporcionando una manera fácil de ejecutar hadolint en la mayoría de las plataformas. Simplemente vaya a su Dockerfile a docker run :
docker run --rm -i hadolint/hadolint < Dockerfile
# OR
docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfileo usando Podman:
podman run --rm -i docker.io/hadolint/hadolint < Dockerfile
# OR
podman run --rm -i ghcr.io/hadolint/hadolint < Dockerfileo usando Windows PowerShell:
cat .Dockerfile | docker run -- rm - i hadolint / hadolint Puede descargar binarios prebuilt para OSX, Windows y Linux desde la última página de lanzamiento. Sin embargo, si esto no funciona para usted, vuelva al contenedor (Docker), brew o la instalación de origen.
En OSX, puede usar Brew para instalar hadolint .
brew install hadolint En Windows, puede usar Scoop para instalar hadolint .
scoop install hadolint En las distribuciones que han instalado nix , puede usar el paquete hadolint para ejecutar conchas ad-hoc o instalar permanentemente hadolint en su entorno.
Como se mencionó anteriormente, hadolint está disponible como una imagen de contenedor:
docker pull hadolint/hadolint
# OR
docker pull ghcr.io/hadolint/hadolintSi necesita un contenedor con acceso de shell, use las variantes Debian o Alpine:
docker pull hadolint/hadolint:latest-debian
# OR
docker pull hadolint/hadolint:latest-alpine
# OR
docker pull ghcr.io/hadolint/hadolint:latest-debian
# OR
docker pull ghcr.io/hadolint/hadolint:latest-alpine También puedes construir hadolint localmente. Necesita Haskell y la herramienta de construcción de Cabal para construir el binario.
git clone https://github.com/hadolint/hadolint
&& cd hadolint
&& cabal configure
&& cabal build
&& cabal installSi desea que la extensión VS Code Hadolint use Hadolint en un contenedor, puede usar el siguiente script de envoltura:
#! /bin/bash
dockerfile= " $1 "
shift
docker run --rm -i hadolint/hadolint hadolint " $@ " - < " $dockerfile " hadolint --help hadolint - Dockerfile Linter written in Haskell
Usage: hadolint [-v|--version] [-c|--config FILENAME] [DOCKERFILE...]
[--file-path-in-report FILEPATHINREPORT] [--no-fail]
[--no-color] [-V|--verbose] [-f|--format ARG] [--error RULECODE]
[--warning RULECODE] [--info RULECODE] [--style RULECODE]
[--ignore RULECODE]
[--trusted-registry REGISTRY (e.g. docker.io)]
[--require-label LABELSCHEMA (e.g. maintainer:text)]
[--strict-labels] [--disable-ignore-pragma]
[-t|--failure-threshold THRESHOLD]
Lint Dockerfile for errors and best practices
Available options:
-h,--help Show this help text
-v,--version Show version
-c,--config FILENAME Path to the configuration file
--file-path-in-report FILEPATHINREPORT
The file path referenced in the generated report.
This only applies for the 'checkstyle' format and is
useful when running Hadolint with Docker to set the
correct file path.
--no-fail Don't exit with a failure status code when any rule
is violated
--no-color Don't colorize output
-V,--verbose Enables verbose logging of hadolint's output to
stderr
-f,--format ARG The output format for the results [tty | json |
checkstyle | codeclimate | gitlab_codeclimate | gnu |
codacy | sonarqube | sarif] (default: tty)
--error RULECODE Make the rule `RULECODE` have the level `error`
--warning RULECODE Make the rule `RULECODE` have the level `warning`
--info RULECODE Make the rule `RULECODE` have the level `info`
--style RULECODE Make the rule `RULECODE` have the level `style`
--ignore RULECODE A rule to ignore. If present, the ignore list in the
config file is ignored
--trusted-registry REGISTRY (e.g. docker.io)
A docker registry to allow to appear in FROM
instructions
--require-label LABELSCHEMA (e.g. maintainer:text)
The option --require-label=label:format makes
Hadolint check that the label `label` conforms to
format requirement `format`
--strict-labels Do not permit labels other than specified in
`label-schema`
--disable-ignore-pragma Disable inline ignore pragmas `# hadolint
ignore=DLxxxx`
-t,--failure-threshold THRESHOLD
Exit with failure code only when rules with a
severity equal to or above THRESHOLD are violated.
Accepted values: [error | warning | info | style |
ignore | none] (default: info)
Los archivos de configuración se pueden usar a nivel mundial o por proyecto. Hadolint busca archivos de configuración en las siguientes ubicaciones o sus equivalentes específicos de plataforma en este orden y utiliza el primero exclusivamente:
$PWD/.hadolint.yaml$XDG_CONFIG_HOME/hadolint.yaml$HOME/.config/hadolint.yaml$HOME/.hadolint/hadolint.yaml or $HOME/hadolint/config.yaml$HOME/.hadolint.yaml En Windows, se usa la variable de entorno %LOCALAPPDATA% en lugar de XDG_CONFIG_HOME . Los archivos de configuración pueden tener extensiones yaml o yml .
esquema de archivo de configuración yaml hadolint
failure-threshold : string # name of threshold level (error | warning | info | style | ignore | none)
format : string # Output format (tty | json | checkstyle | codeclimate | gitlab_codeclimate | gnu | codacy)
ignored : [string] # list of rules
label-schema : # See Linting Labels below for specific label-schema details
author : string # Your name
contact : string # email address
created : timestamp # rfc3339 datetime
version : string # semver
documentation : string # url
git-revision : string # hash
license : string # spdx
no-color : boolean # true | false
no-fail : boolean # true | false
override :
error : [string] # list of rules
warning : [string] # list of rules
info : [string] # list of rules
style : [string] # list of rules
strict-labels : boolean # true | false
disable-ignore-pragma : boolean # true | false
trustedRegistries : string | [string] # registry or list of registries hadolint admite especificar las reglas ignoradas utilizando un archivo de configuración. El archivo de configuración debe estar en formato yaml . Este es un archivo de configuración válido como ejemplo:
ignored :
- DL3000
- SC1010 Además, hadolint puede advertirle cuando las imágenes de repositorios no confiables se utilizan en DockerFiles, puede agregar las claves de trustedRegistries en el archivo de configuración, como se muestra a continuación:
ignored :
- DL3000
- SC1010
trustedRegistries :
- docker.io
- my-company.com:5000
- " *.gcr.io "Si desea anular la gravedad de las reglas específicas, también puede hacerlo:
override :
error :
- DL3001
- DL3002
warning :
- DL3042
- DL3033
info :
- DL3032
style :
- DL3015 La salida failure-threshold con el código de falla solo cuando se violan las reglas con gravedad por encima del umbral (disponible en v2.6.0+)
failure-threshold : info
override :
warning :
- DL3042
- DL3033
info :
- DL3032 Además, puede pasar un archivo de configuración personalizado en la línea de comando con la opción --config
hadolint --config /path/to/config.yaml DockerfilePara pasar un archivo de configuración personalizado (usando una ruta relativa o absoluta) a un contenedor, use el siguiente comando:
docker run --rm -i -v /your/path/to/hadolint.yaml:/.config/hadolint.yaml hadolint/hadolint < Dockerfile
# OR
docker run --rm -i -v /your/path/to/hadolint.yaml:/.config/hadolint.yaml ghcr.io/hadolint/hadolint < DockerfileAdemás de los archivos de configuración, Hadolint se puede configurar con variables de entorno.
NO_COLOR=1 # Set or unset. See https://no-color.org
HADOLINT_NOFAIL=1 # Truthy value e.g. 1, true or yes
HADOLINT_VERBOSE=1 # Truthy value e.g. 1, true or yes
HADOLINT_FORMAT=json # Output format (tty | json | checkstyle | codeclimate | gitlab_codeclimate | gnu | codacy | sarif )
HADOLINT_FAILURE_THRESHOLD=info # threshold level (error | warning | info | style | ignore | none)
HADOLINT_OVERRIDE_ERROR=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_WARNING=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_INFO=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_OVERRIDE_STYLE=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_IGNORE=DL3010,DL3020 # comma separated list of rule codes
HADOLINT_STRICT_LABELS=1 # Truthy value e.g. 1, true or yes
HADOLINT_DISABLE_IGNORE_PRAGMA=1 # Truthy value e.g. 1, true or yes
HADOLINT_TRUSTED_REGISTRIES=docker.io # comma separated list of registry urls
HADOLINT_REQUIRE_LABELS=maintainer:text # comma separated list of label schema items Cuando se usa imágenes base con capas no posiculares como predeterminadas (por ejemplo, imágenes basadas en Windows), un hadolint shell especial puede especificar qué shell usa la imagen base, para que Hadolint pueda ignorar automáticamente todas las reglas específicas de la carcasa.
FROM mcr.microsoft.com/windows/servercore:ltsc2022
# hadolint shell=powershell
RUN Get-Process notepad | Stop-Process También es posible ignorar las reglas agregando un comentario especial directamente por encima de la declaración DockerFile para la que desea hacer una excepción. Tales comentarios se ven como # hadolint ignore=DL3001,SC1081 . Por ejemplo:
# hadolint ignore=DL3006
FROM ubuntu
# hadolint ignore=DL3003,SC1035
RUN cd /tmp && echo "hello!"El comentario "en línea ignora" se aplica solo a la declaración que sigue.
Las reglas también se pueden ignorar por archivo utilizando el Pragma Global Ignore. Funciona como Inline Ignores, excepto que se aplica a todo el archivo en lugar de solo la siguiente línea.
# hadolint global ignore=DL3003,DL3006,SC1035
FROM ubuntu
RUN cd /tmp && echo "foo" Hadolint puede verificar si están presentes etiquetas específicas y se ajustan a un esquema de etiqueta predefinido. Primero, un esquema de etiqueta debe definirse a través de la línea de comando:
hadolint --require-label author:text --require-label version:semver Dockerfileo a través del archivo de configuración:
label-schema :
author : text
contact : email
created : rfc3339
version : semver
documentation : url
git-revision : hash
license : spdx El valor de una etiqueta puede ser de text , url , semver , hash o rfc3339 :
| Esquema | Descripción |
|---|---|
| texto | Cualquier cosa |
| RFC3339 | Una hora, formateada según RFC 3339 |
| semver | Una versión semántica |
| url | Un URI como se describe en RFC 3986 |
| picadillo | Un hash breve o largo |
| spdx | Un identificador de licencia SPDX |
| correo electrónico | Una dirección de correo electrónico que se ajusta a RFC 5322 |
Por defecto, Hadolint ignora cualquier etiqueta que no se especifique en el esquema de la etiqueta. Para advertir contra tales etiquetas adicionales, active etiquetas estrictas, utilizando la línea de comando:
hadolint --strict-labels --require-label version:semver Dockerfileo el archivo de configuración:
strict-labels : true Cuando las etiquetas estrictas están habilitadas, pero no se especifica ningún esquema de etiqueta, hadolint advertirá si hay alguna etiqueta presente.
Es un patrón común llenar el valor de una etiqueta no estáticamente, sino dinámicamente en el tiempo de construcción utilizando una variable:
FROM debian:buster
ARG VERSION= "du-jour"
LABEL version= "${VERSION}" Para permitir esto, el esquema de la etiqueta debe especificar text como valor para esa etiqueta:
label-schema :
version : text Para obtener la mayor parte de hadolint , es útil integrarlo como un cheque en su CI o en su editor, o como un gancho previo al compromiso, para pellar su Dockerfile mientras lo escribe. Vea nuestros documentos de integración.
Una lista incompleta de reglas implementadas. Haga clic en el código de error para obtener información más detallada.
Las reglas con el prefijo DL son de hadolint . Eche un vistazo a Rules.hs para encontrar la implementación de las reglas.
Las reglas con el prefijo SC son de Shellcheck (solo se enumeran las reglas más comunes, hay docenas más).
Cree un problema si tiene una idea para una buena regla.
| Regla | Severidad predeterminada | Descripción |
|---|---|---|
| DL1001 | Ignorar | Abstenerse de usar en línea ignore pragmas # hadolint ignore=DLxxxx . |
| Dl3000 | Error | Use el trabajo de trabajo absoluto. |
| DL3001 | Información | Para algunos comandos bash, no tiene sentido ejecutarlos en un contenedor Docker como SSH, VIM, CAPA, Servicio, PS, Free, Top, Kill, Mount, Ifconfig. |
| DL3002 | Advertencia | El último usuario no debe ser root. |
| DL3003 | Advertencia | Use WorkDir para cambiar a un directorio. |
| DL3004 | Error | No use sudo, ya que conduce a un comportamiento impredecible. Use una herramienta como GOSU para hacer cumplir la raíz. |
| DL3006 | Advertencia | Siempre etiquete la versión de una imagen explícitamente. |
| DL3007 | Advertencia | El uso de lo último es propenso a errores si la imagen se actualiza alguna vez. Pon la versión explícitamente a una etiqueta de lanzamiento. |
| DL3008 | Advertencia | Versiones PIN en apt-get install . |
| DL3009 | Información | Elimine las listas APT-Get después de instalar algo. |
| DL3010 | Información | Use Agregar para extraer archivos en una imagen. |
| DL3011 | Error | Los puertos UNIX válidos varían de 0 a 65535. |
| DL3012 | Error | Múltiples instrucciones HEALTHCHECK . |
| DL3013 | Advertencia | Versiones PIN en PIP. |
| DL3014 | Advertencia | Use el interruptor -y . |
| DL3015 | Información | Evite paquetes adicionales especificando --no-install-recommends . |
| DL3016 | Advertencia | Versiones PIN en npm . |
| DL3018 | Advertencia | Versiones PIN en apk add . En lugar de apk add <package> Use apk add <package>=<version> . |
| DL3019 | Información | Use el interruptor --no-cache para evitar la necesidad de usar --update y eliminar /var/cache/apk/* cuando termine de instalar paquetes. |
| DL3020 | Error | Use COPY en lugar de ADD para archivos y carpetas. |
| DL3021 | Error | COPY con más de 2 argumentos requiere que el último argumento termine con / |
| DL3022 | Advertencia | COPY --from debe hacer referencia a un alias definido previamente definido FROM |
| DL3023 | Error | COPY --from no puede hacer referencia a la suya FROM el alias |
| DL3024 | Error | FROM los alias (nombres de teatro) debe ser único |
| DL3025 | Advertencia | Use argumentos JSON Notación para CMD y EntryPoint Arguments |
| DL3026 | Error | Use solo un registro permitido en la FROM image |
| DL3027 | Advertencia | No use apt , ya que está destinado a ser una herramienta de usuario final, use apt-get o apt-cache en su lugar |
| DL3028 | Advertencia | Versiones de PIN en la instalación de gemas. En lugar de gem install <gem> use gem install <gem>:<version> |
| DL3029 | Advertencia | No use el indicador de plataforma con desde. |
| DL3030 | Advertencia | Use el interruptor -y para evitar la entrada manual yum install -y <package> |
| DL3032 | Advertencia | yum clean all falta después del comando yum. |
| DL3033 | Advertencia | Especifique la versión con yum install -y <package>-<version> |
| DL3034 | Advertencia | Interruptor no interactivo Falta del comando zypper : zypper install -y |
| DL3035 | Advertencia | No use zypper dist-upgrade . |
| DL3036 | Advertencia | zypper clean falta después del uso de Zypper. |
| DL3037 | Advertencia | Especifique la versión con zypper install -y <package>[=]<version> . |
| DL3038 | Advertencia | Use el interruptor -y para evitar la entrada manual dnf install -y <package> |
| DL3040 | Advertencia | dnf clean all lo que falta después del comando DNF. |
| DL3041 | Advertencia | Especifique la versión con dnf install -y <package>-<version> |
| DL3042 | Advertencia | Evite el directorio de caché con pip install --no-cache-dir <package> . |
| DL3043 | Error | ONBUILD , FROM o MAINTAINER desencadenado desde la instrucción ONBUILD . |
| DL3044 | Error | No se refiera a una variable de entorno dentro de la misma declaración ENV donde se define. |
| DL3045 | Advertencia | COPY a un destino relativo sin el conjunto WORKDIR . |
| DL3046 | Advertencia | useradd sin flag -l y alto UID darán lugar a una imagen excesivamente grande. |
| DL3047 | Información | wget sin FLAG --progress dará como resultado registros de compilación excesivamente hinchados al descargar archivos más grandes. |
| DL3048 | Estilo | Clave de etiqueta no válida |
| DL3049 | Información | Falta la etiqueta <label> . |
| DL3050 | Información | Etiquetas superfluas presentes. |
| DL3051 | Advertencia | La etiqueta <label> está vacía. |
| DL3052 | Advertencia | La etiqueta <label> no es una URL válida. |
| DL3053 | Advertencia | La etiqueta <label> no es un formato de tiempo válido: debe cumplir con RFC3339. |
| DL3054 | Advertencia | La etiqueta <label> no es un identificador de licencia SPDX válido. |
| DL3055 | Advertencia | La etiqueta <label> no es un hash Git válido. |
| DL3056 | Advertencia | Etiqueta <label> no se ajusta al versiones semánticas. |
| DL3057 | Ignorar | Falta la instrucción HEALTHCHECK . |
| DL3058 | Advertencia | La etiqueta <label> no es un formato de correo electrónico válido: debe cumplir con RFC5322. |
| DL3059 | Información | Múltiples instrucciones RUN consecutivas. Considere la consolidación. |
| DL3060 | Información | yarn cache clean después de que se ejecutara yarn install . |
| DL3061 | Error | Orden de instrucciones no válidas. Dockerfile debe comenzar FROM , ARG o comentario. |
| Dl4000 | Error | MAINTAINER está en desuso. |
| DL4001 | Advertencia | Use WGet o Curl pero no ambos. |
| DL4003 | Advertencia | Múltiples instrucciones CMD encontradas. |
| DL4004 | Error | Múltiples instrucciones ENTRYPOINT encontradas. |
| DL4005 | Advertencia | Use SHELL para cambiar el shell predeterminado. |
| DL4006 | Advertencia | Establezca la opción SHELL -O pipefail antes de RUN con una tubería |
| SC1000 | $ no se usa especialmente y, por lo tanto, debe escaparse. | |
| SC1001 | Esta c será una 'c' regular en este contexto. | |
| SC1007 | Eliminar espacio después = si intenta asignar un valor (o para una cadena vacía, use var='' ... ). | |
| SC1010 | Use semicolon o done de línea antes (o cita para hacerlo literal). | |
| SC1018 | Este es un espacio no roto unicode. Eliminarlo y volver a escribir como espacio. | |
| SC1035 | Necesitas un espacio aquí | |
| SC1045 | No es foo &; bar , solo foo & bar . | |
| SC1065 | Tratando de declarar parámetros? No. Use () y consulte los parámetros como $1 , $2 , etc. | |
| SC1066 | No use $ en el lado izquierdo de las tareas. | |
| SC1068 | No ponga espacios alrededor del = en las tareas. | |
| SC1077 | Para la expansión del comando, la garrapata debe inclinar a la izquierda (`vs ´). | |
| SC1078 | ¿Olvidaste cerrar esta cadena de doble cotización? | |
| SC1079 | Esta es en realidad una cita final, pero debido al próximo char, parece sospechoso. | |
| SC1081 | Los scripts son sensibles a los boscos. Use if , no If . | |
| SC1083 | Esto {/} es literal. Verifique la expresión (falta ;/n ?) O cídela. | |
| SC1086 | No use $ en el nombre del iterador para bucles. | |
| SC1087 | Se requieren aparatos ortopédicos al expandir matrices, como en ${array[idx]} . | |
| SC1095 | Necesita un espacio o alimentación de línea entre el nombre de la función y el cuerpo. | |
| SC1097 | Inesperado == . Para la asignación, use = . Para comparación, use [ .. ] o [[ .. ]] . | |
| SC1098 | Cita/Escapar caracteres especiales cuando se usa eval , por ejemplo, eval "a=(b)" . | |
| SC1099 | Necesitas un espacio antes del # . | |
| SC2002 | Gato inútil. Considere cmd < file | .. o cmd file | .. en cambio. | |
| SC2015 | Tenga en cuenta que A && B || C no es si-entonces-else. C puede funcionar cuando A es verdad. | |
| SC2026 | Esta palabra está fuera de las citas. ¿Tenía la intención de 'anidar' "'citas individuales'" 'en su lugar'? | |
| SC2028 | echo no ampliará las secuencias de escape. Considere printf . | |
| SC2035 | Use ./*glob* o -- *glob* para que los nombres con guiones no se conviertan en opciones. | |
| SC2039 | En Posix SH, algo está indefinido. | |
| SC2046 | Cita esto para evitar la división de palabras | |
| SC2086 | Cita doble para evitar el globo y la división de palabras. | |
| SC2140 | La palabra está en la forma "A"B"C" (b indicada). ¿Quiso decir "ABC" o "A"B"C" ? | |
| SC2154 | VAR se hace referencia pero no se asigna. | |
| SC2155 | Declarar y asignar por separado para evitar los valores de retorno de enmascaramiento. | |
| SC2164 | Use cd ... || exit en caso de que cd falle. |
Si usted es un Haskeller experimentado, estaríamos muy agradecidos si destrozará nuestro código en una revisión.
Para compilar, necesitará un ambiente de Haskell reciente y cabal-install .
Repositorio de clon
git clone --recursive [email protected]:hadolint/hadolint.gitInstalar dependencias y compilar fuente
cabal configure
cabal build(Opcional) Instale Hadolint en su sistema
cabal installLa forma más fácil de probar el analizador es usar el repl.
# start the repl
cabal repl
# overload strings to be able to use Text
:set -XOverloadedStrings
# import parser library
import Language.Docker
# parse instruction and look at AST representation
parseText " FROM debian:jessie "Compilar con pruebas unitarias y ejecutarlas:
cabal configure --enable-tests
cabal build --enable-tests
cabal testEjecutar pruebas de integración:
./integration_test.sh La sintaxis de Dockerfile se describe completamente en la referencia DockerFile. Simplemente eche un vistazo a Syntax.hs en el proyecto language-docker para ver la definición AST.
Hadolint usa muchas bibliotecas para hacer el trabajo sucio. En particular, el docker del lenguaje se usa para analizar DockerFiles y producir un AST que luego se puede analizar. Para construir Hadolint contra una versión personalizada de tales bibliotecas, haga lo siguiente. Este ejemplo utiliza el docker de idiomas, pero también funcionaría con cualquier otra biblioteca.
/home/user/repos Ej. cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.gitHaga sus modificaciones a Language-Docker
En el repositorio de Hadolint, edite el archivo cabal.project , de modo que la propiedad packages apunta al otro repositorio también
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test replicatedHq/DockerFilelint, el otro linter utilizado por Super-Linter
RedCoolBeans/Dockerlint
Projectomic/dockerfile_lint