
Um linhador Dockerfile mais inteligente que ajuda a criar imagens de melhor prática do Docker. O Linter analisa o Dockerfile em um AST e executa regras no topo da AST. Ele fica nos ombros da verificação do shells para fingir o código Bash dentro das instruções RUN .
Verifique a versão on -line no hadoLint.github.io/hadolint
Você pode executar hadolint localmente para fiar seu 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 O Docker vem em socorro, fornecendo uma maneira fácil de executar hadolint na maioria das plataformas. Basta colocar o seu Dockerfile para docker run :
docker run --rm -i hadolint/hadolint < Dockerfile
# OR
docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfileou usando podman:
podman run --rm -i docker.io/hadolint/hadolint < Dockerfile
# OR
podman run --rm -i ghcr.io/hadolint/hadolint < Dockerfileou usando o Windows PowerShell:
cat .Dockerfile | docker run -- rm - i hadolint / hadolint Você pode baixar binários pré -construídos para OSX, Windows e Linux na página de lançamento mais recente. No entanto, se isso não funcionar para você, volte ao contêiner (Docker), instalação brew ou fonte.
No OSX, você pode usar o Brew para instalar hadolint .
brew install hadolint No Windows, você pode usar o SCOOP para instalar hadolint .
scoop install hadolint Nas distribuições que têm nix instalado, você pode usar o pacote hadolint para executar shells ad-hoc ou instalar permanentemente hadolint em seu ambiente.
Como mencionado anteriormente, hadolint está disponível como uma imagem de contêiner:
docker pull hadolint/hadolint
# OR
docker pull ghcr.io/hadolint/hadolintSe você precisar de um contêiner com acesso ao shell, use as variantes Debian ou 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 Você também pode construir hadolint localmente. Você precisa da Haskell e da Cabal Build Tool para construir o binário.
git clone https://github.com/hadolint/hadolint
&& cd hadolint
&& cabal configure
&& cabal build
&& cabal installSe você deseja a extensão do vs Código Hadolint para usar o Hadolint em um contêiner, você pode usar o seguinte script de wrapper:
#! /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)
Os arquivos de configuração podem ser usados globalmente ou por projeto. Hadolint procura arquivos de configuração nos locais a seguir ou em seus equivalentes específicos da plataforma nesta ordem e usa o primeiro 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 No Windows, a variável de ambiente %LOCALAPPDATA% é usada em vez de XDG_CONFIG_HOME . Os arquivos de configuração podem ter extensões yaml ou yml .
hadolint Full yaml Config Arquive Schema
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 suporta especificar as regras ignoradas usando um arquivo de configuração. O arquivo de configuração deve estar no formato yaml . Este é um arquivo de configuração válido como exemplo:
ignored :
- DL3000
- SC1010 Além disso, hadolint pode avisá -lo quando imagens de repositórios não confiáveis estão sendo usados em dockerfiles, você pode anexar as chaves trustedRegistries ao arquivo de configuração, como mostrado abaixo:
ignored :
- DL3000
- SC1010
trustedRegistries :
- docker.io
- my-company.com:5000
- " *.gcr.io "Se você deseja substituir a gravidade de regras específicas, também pode fazer isso:
override :
error :
- DL3001
- DL3002
warning :
- DL3042
- DL3033
info :
- DL3032
style :
- DL3015 failure-threshold de saída com o código de falha somente quando as regras com uma gravidade acima do limite são violadas (disponível na v2.6.0+)
failure-threshold : info
override :
warning :
- DL3042
- DL3033
info :
- DL3032 Além disso, você pode passar por um arquivo de configuração personalizado na linha de comando com a opção --config
hadolint --config /path/to/config.yaml DockerfilePara passar um arquivo de configuração personalizado (usando caminho relativo ou absoluto) para um contêiner, use o seguinte 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 < DockerfileAlém dos arquivos de configuração, o Hadolint pode ser configurado com variáveis de ambiente.
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 Ao usar imagens básicas com shells não-posix como padrão (por exemplo, imagens baseadas no Windows), um hadolint shell pode especificar qual Shell a imagem base usa, para que o Hololint possa ignorar automaticamente todas as regras específicas da Shell.
FROM mcr.microsoft.com/windows/servercore:ltsc2022
# hadolint shell=powershell
RUN Get-Process notepad | Stop-Process Também é possível ignorar as regras adicionando um comentário especial diretamente acima da declaração do Dockerfile para a qual você deseja fazer uma exceção. Tais comentários parecem # hadolint ignore=DL3001,SC1081 . Por exemplo:
# hadolint ignore=DL3006
FROM ubuntu
# hadolint ignore=DL3003,SC1035
RUN cd /tmp && echo "hello!"O comentário "inline ignora" se aplica apenas à declaração seguindo.
As regras também podem ser ignoradas por arquivo usando o Pragma ignorado global. Funciona como o Inline ignora, exceto que se aplica ao arquivo inteiro, em vez de apenas à próxima linha.
# hadolint global ignore=DL3003,DL3006,SC1035
FROM ubuntu
RUN cd /tmp && echo "foo" O Hadolint é capaz de verificar se rótulos específicos estão presentes e estão em conformidade com um esquema de etiquetas predefinidas. Primeiro, um esquema de etiqueta deve ser definido através da linha de comando:
hadolint --require-label author:text --require-label version:semver Dockerfileou através do arquivo de configuração:
label-schema :
author : text
contact : email
created : rfc3339
version : semver
documentation : url
git-revision : hash
license : spdx O valor de uma etiqueta pode ser de text , url , semver , hash ou rfc3339 :
| Esquema | Descrição |
|---|---|
| texto | Qualquer coisa |
| RFC3339 | Um tempo, formatado de acordo com a RFC 3339 |
| Semver | Uma versão semântica |
| url | Um URI conforme descrito na RFC 3986 |
| Hash | Um hash curto ou longo |
| spdx | Um identificador de licença SPDX |
| Um endereço de e -mail em conformidade com a RFC 5322 |
Por padrão, o Hololint ignora qualquer rótulo que não seja especificado no esquema do rótulo. Para alertar contra tais rótulos adicionais, ligue rótulos rígidos, usando a linha de comando:
hadolint --strict-labels --require-label version:semver Dockerfileou o arquivo de configuração:
strict-labels : true Quando os rótulos rígidos são ativados, mas nenhum esquema de etiqueta é especificado, hadolint avisará se algum rótulo estiver presente.
É um padrão comum preencher o valor de um rótulo não estaticamente, mas dinamicamente no tempo de construção usando uma variável:
FROM debian:buster
ARG VERSION= "du-jour"
LABEL version= "${VERSION}" Para permitir isso, o esquema do rótulo deve especificar text como valor para esse rótulo:
label-schema :
version : text Para obter a maior parte do hadolint , é útil integrá-lo como uma verificação no seu CI ou no seu editor, ou como um gancho de pré-compromisso, para fingir o seu Dockerfile ao escrever. Veja nossos documentos de integração.
Uma lista incompleta de regras implementadas. Clique no código de erro para obter informações mais detalhadas.
As regras com o prefixo DL são de hadolint . Veja as Rules.hs para encontrar a implementação das regras.
As regras com o prefixo SC são do shellcheck (apenas as regras mais comuns estão listadas, há mais dezenas).
Crie um problema se você tiver uma ideia para uma boa regra.
| Regra | Gravidade padrão | Descrição |
|---|---|---|
| DL1001 | Ignorar | Evite usar o Ignore Pragmas # hadolint ignore=DLxxxx . |
| DL3000 | Erro | Use Workdir absoluto. |
| DL3001 | Informações | Para alguns comandos bash, não faz sentido executá -los em um recipiente do Docker como SSH, VIM, desligamento, serviço, PS, grátis, top, matar, montar, ifconfig. |
| DL3002 | Aviso | Último usuário não deve ser root. |
| DL3003 | Aviso | Use o Workdir para mudar para um diretório. |
| DL3004 | Erro | Não use sudo, pois leva a um comportamento imprevisível. Use uma ferramenta como o GOSU para aplicar root. |
| DL3006 | Aviso | Sempre marque a versão de uma imagem explicitamente. |
| DL3007 | Aviso | Usar mais recente é propenso a erros se a imagem será atualizada. Prenda a versão explicitamente em uma tag de liberação. |
| DL3008 | Aviso | Versões PIN na apt-get install . |
| DL3009 | Informações | Exclua as listas APT-Get após a instalação de algo. |
| DL3010 | Informações | Use add para extrair arquivos em uma imagem. |
| DL3011 | Erro | As portas Unix válidas variam de 0 a 65535. |
| DL3012 | Erro | Múltiplas instruções HEALTHCHECK . |
| DL3013 | Aviso | Versões PIN no PIP. |
| DL3014 | Aviso | Use o interruptor -y . |
| DL3015 | Informações | Evite pacotes adicionais especificando --no-install-recommends . |
| DL3016 | Aviso | Versões PIN no npm . |
| DL3018 | Aviso | Versões PIN no apk add . Em vez de apk add <package> Use apk add <package>=<version> . |
| DL3019 | Informações | Use a chave --no-cache para evitar a necessidade de usar --update e remover /var/cache/apk/* quando estiver pronto para instalar pacotes. |
| DL3020 | Erro | Use COPY em vez de ADD para arquivos e pastas. |
| DL3021 | Erro | COPY com mais de 2 argumentos requer o último argumento para terminar com / |
| DL3022 | Aviso | COPY --from -de referência a um FROM anteriormente definido |
| DL3023 | Erro | COPY --from FROM |
| DL3024 | Erro | FROM aliases (nomes de teatro) devem ser únicos |
| DL3025 | Aviso | Use argumentos JSON notação para CMD e argumentos de entrada |
| DL3026 | Erro | Use apenas um registro permitido na FROM image |
| DL3027 | Aviso | Não use apt , pois deve ser uma ferramenta de usuário final, use apt-get ou apt-cache |
| DL3028 | Aviso | Versões PIN na instalação do GEM. Em vez de gem install <gem> use gem install <gem>:<version> |
| DL3029 | Aviso | Não use -sinalizador de plataforma com de. |
| DL3030 | Aviso | Use o switch -y para evitar a entrada manual yum install -y <package> |
| DL3032 | Aviso | yum clean all faltando após o comando yum. |
| DL3033 | Aviso | Especifique a versão com yum install -y <package>-<version> |
| DL3034 | Aviso | Interruptor não interativo ausente do comando zypper : zypper install -y |
| DL3035 | Aviso | Não use zypper dist-upgrade . |
| DL3036 | Aviso | zypper clean Falta após o uso do Zypper. |
| DL3037 | Aviso | Especifique a versão com zypper install -y <package>[=]<version> . |
| DL3038 | Aviso | Use o switch -y para evitar a entrada manual dnf install -y <package> |
| DL3040 | Aviso | dnf clean all faltando após o comando dnf. |
| DL3041 | Aviso | Especifique a versão com dnf install -y <package>-<version> |
| DL3042 | Aviso | Evite o diretório de cache com pip install --no-cache-dir <package> . |
| DL3043 | Erro | ONBUILD , FROM ou MAINTAINER desencadeado a partir de instruções ONBUILD . |
| DL3044 | Erro | Não se consulte a uma variável de ambiente dentro da mesma declaração ENV em que ela é definida. |
| DL3045 | Aviso | COPY para um destino relativo sem o conjunto WORKDIR . |
| DL3046 | Aviso | useradd Without Flag -l e High UID resultará em imagem excessivamente grande. |
| DL3047 | Informações | wget sem sinalizador --progress resultará em logs de construção excessivamente inchados ao baixar arquivos maiores. |
| DL3048 | Estilo | Chave de etiqueta inválida |
| DL3049 | Informações | Label <label> está ausente. |
| DL3050 | Informações | Etiqueta (s) supérflua (s) presente. |
| DL3051 | Aviso | Rótulo <label> está vazio. |
| DL3052 | Aviso | Label <label> não é um URL válido. |
| DL3053 | Aviso | Label <label> não é um formato de tempo válido - deve estar em conformidade com RFC3339. |
| DL3054 | Aviso | Label <label> não é um identificador de licença SPDX válido. |
| DL3055 | Aviso | Label <label> não é um hash git válido. |
| DL3056 | Aviso | Label <label> não está em conformidade com a versão semântica. |
| DL3057 | Ignorar | HEALTHCHECK Instrução ausente. |
| DL3058 | Aviso | Label <label> não é um formato de email válido - deve estar em conformidade com RFC5322. |
| DL3059 | Informações | Múltiplas instruções consecutivas RUN . Considere consolidação. |
| DL3060 | Informações | yarn cache clean a falta após yarn install foi executado. |
| DL3061 | Erro | Ordem de instrução inválida. Dockerfile deve começar FROM , ARG ou comentário. |
| DL4000 | Erro | MAINTAINER está preguiçoso. |
| DL4001 | Aviso | Use wget ou cacho, mas não ambos. |
| DL4003 | Aviso | Múltiplas instruções de CMD encontradas. |
| DL4004 | Erro | Múltiplas instruções ENTRYPOINT encontradas. |
| DL4005 | Aviso | Use SHELL para alterar o shell padrão. |
| DL4006 | Aviso | Defina a opção SHELL -O Pipefail antes RUN com um cano |
| SC1000 | $ não é usado especialmente e, portanto, deve ser escapado. | |
| SC1001 | Este c será um 'c' regular neste contexto. | |
| SC1007 | Remova o espaço depois = se estiver tentando atribuir um valor (ou para string vazia, use var='' ... ). | |
| SC1010 | Use o semicolon ou o alinhamento antes done (ou cota para torná -lo literal). | |
| SC1018 | Este é um espaço sem quebra unicode. Exclua e digite o espaço como espaço. | |
| SC1035 | Você precisa de um espaço aqui | |
| SC1045 | Não é foo &; bar , apenas foo & bar . | |
| SC1065 | Tentando declarar parâmetros? Não. Use () e consulte os parâmetros como $1 , $2 etc. | |
| SC1066 | Não use $ no lado esquerdo das tarefas. | |
| SC1068 | Não coloque espaços em torno das = . | |
| SC1077 | Para expansão de comando, o carrapato deve inclinar -se à esquerda (`vs ´). | |
| SC1078 | Você esqueceu de fechar esta string de dupla citação? | |
| SC1079 | Na verdade, esta é uma citação final, mas devido ao próximo char, parece suspeito. | |
| SC1081 | Os scripts são sensíveis ao maiúsculas. Use if , não If . | |
| SC1083 | Este {/} é literal. Verifique a expressão (ausente ;/n ?) Ou cite -a. | |
| SC1086 | Não use $ no nome do iterador para loops. | |
| SC1087 | Os aparelhos são necessários ao expandir as matrizes, como em ${array[idx]} . | |
| SC1095 | Você precisa de um espaço ou alinhamento entre o nome da função e o corpo. | |
| SC1097 | Inesperado == . Para atribuição, use = . Para comparação, use [ .. ] ou [[ .. ]] . | |
| SC1098 | CITE/ESCAPE DE CARACTERInes especiais ao usar eval , por exemplo, eval "a=(b)" . | |
| SC1099 | Você precisa de um espaço antes do # . | |
| SC2002 | Gato inútil. Considere cmd < file | .. ou cmd file | .. em vez de. | |
| SC2015 | Observe que A && B || C não é se-then-else. C pode ser executado quando A é verdadeiro. | |
| SC2026 | Esta palavra está fora das citações. Você pretendia 'ninho' '' citações únicas '' 'em vez'? | |
| SC2028 | echo não expande sequências de fuga. Considere printf . | |
| SC2035 | Use ./*glob* ou -- *glob* para que os nomes com traços não se tornem opções. | |
| SC2039 | Em Posix sh, algo está indefinido. | |
| SC2046 | Citar isso para impedir a divisão de palavras | |
| SC2086 | Citação dupla para impedir a divisão do globbing e das palavras. | |
| SC2140 | A palavra está na forma "A"B"C" (B indicada). Você quis dizer "ABC" ou "A"B"C" ? | |
| SC2154 | O VAR é referenciado, mas não atribuído. | |
| SC2155 | Declare e atribua separadamente para evitar o mascaramento de valores de retorno. | |
| SC2164 | Use cd ... || exit no caso de cd falhar. |
Se você é um Haskeller experiente, ficaríamos muito agradecidos se você destruísse nosso código em uma revisão.
Para compilar, você precisará de um ambiente recente de Haskell e cabal-install .
Repositório de clones
git clone --recursive [email protected]:hadolint/hadolint.gitInstalar dependências e compilar fonte
cabal configure
cabal build(Opcional) Instale o Hololint no seu sistema
cabal installA maneira mais fácil de experimentar o analisador está usando o 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 com testes de unidade e executá -los:
cabal configure --enable-tests
cabal build --enable-tests
cabal testExecute testes de integração:
./integration_test.sh A sintaxe do Dockerfile está totalmente descrita na referência do Dockerfile. Basta dar uma olhada na Syntax.hs no projeto language-docker para ver a definição AST.
Hadolint usa muitas bibliotecas para fazer o trabalho sujo. Em particular, o Docker de Idioma é usado para analisar os Dockerfiles e produzir um AST que pode ser analisado. Para construir o Hadolint contra uma versão personalizada dessas bibliotecas, faça o seguinte. Este exemplo usa o Docker de Idioma, mas também funcionaria com qualquer outra biblioteca.
/home/user/repos Git GIT de Hadolint e Docker Language-Docker cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.gitFaça suas modificações para o Docker Language
No repositório Hadolint, edite o arquivo cabal.project , de modo que os packages também apontam para o outro repo
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test replicadohq/dockerfilelint, o outro linhador usado pelo super-linter
RedCoolbeans/Dockerlint
Projectatomic/Dockerfile_lint