
Умный Linter Dockerfile, который помогает вам создать лучшие изображения Docker. Линтер анализирует Dockerfile в AST и выполняет правила на вершине AST. Он стоит на плечах ShellCheck, чтобы пробиться в код Bash Inside RUN Insings.
Проверьте онлайн -версию на hadolint.github.io/hadolint 
Вы можете запустить hadolint на месте, чтобы прокинуть свой 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 приходит на помощь, обеспечивая простой способ запустить hadolint на большинстве платформ. Просто подчините свой Dockerfile до docker run :
docker run --rm -i hadolint/hadolint < Dockerfile
# OR
docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfileили с помощью подмана:
podman run --rm -i docker.io/hadolint/hadolint < Dockerfile
# OR
podman run --rm -i ghcr.io/hadolint/hadolint < Dockerfileили с помощью Windows PowerShell:
cat .Dockerfile | docker run -- rm - i hadolint / hadolint Вы можете скачать предварительно построенные двоичные файлы для OSX, Windows и Linux с последней страницы выпуска. Однако, если это не работает для вас, пожалуйста, вернитесь к контейнеру (Docker), brew или установке источника.
На OSX вы можете использовать Brew для установки hadolint .
brew install hadolint В Windows вы можете использовать Scoop для установки hadolint .
scoop install hadolint На распределениях, в которых установлен nix , вы можете использовать пакет hadolint для запуска специальных оболочек или навсегда установить hadolint в вашу среду.
Как упоминалось ранее, hadolint доступен как изображение контейнера:
docker pull hadolint/hadolint
# OR
docker pull ghcr.io/hadolint/hadolintЕсли вам нужен контейнер с доступом к оболочке, используйте варианты Debian или 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 Вы также можете построить hadolint на местном уровне. Вам нужны Haskell и инструмент сборки CABAL для построения бинарного файла.
git clone https://github.com/hadolint/hadolint
&& cd hadolint
&& cabal configure
&& cabal build
&& cabal installЕсли вы хотите, чтобы расширение HadoLint кода VS использовала HadoLint в контейнере, вы можете использовать следующий сценарий обертки:
#! /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)
Файлы конфигурации могут использоваться глобально или по проекту. HadoLint ищет файлы конфигурации в следующих местоположениях или их специальных эквивалентах их платформы в этом порядке и использует первую исключительно:
$PWD/.hadolint.yaml$XDG_CONFIG_HOME/hadolint.yaml$HOME/.config/hadolint.yaml$HOME/.hadolint/hadolint.yaml or $HOME/hadolint/config.yaml$HOME/.hadolint.yaml В Windows вместо XDG_CONFIG_HOME используется переменная среды %LOCALAPPDATA% . Файлы конфигурации могут иметь расширения yaml или yml .
hadolint Full yaml Config File 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 поддерживает указание игнорируемых правил, используя файл конфигурации. Файл конфигурации должен быть в формате yaml . В качестве примера это один действительный файл конфигурации:
ignored :
- DL3000
- SC1010 Кроме того, hadolint может предупредить вас, когда в Dockerfiles используются изображения из ненадежных репозитории, вы можете добавить ключи trustedRegistries к файлу конфигурации, как показано ниже:
ignored :
- DL3000
- SC1010
trustedRegistries :
- docker.io
- my-company.com:5000
- " *.gcr.io "Если вы хотите переопределить серьезность конкретных правил, вы тоже можете это сделать:
override :
error :
- DL3001
- DL3002
warning :
- DL3042
- DL3033
info :
- DL3032
style :
- DL3015 Отказ failure-threshold с кодом сбоя только в том случае, если нарушаются правила с строгой выше порога (доступны в V2.6.0+)
failure-threshold : info
override :
warning :
- DL3042
- DL3033
info :
- DL3032 Кроме того, вы можете передать пользовательский файл конфигурации в командной строке с опцией --config
hadolint --config /path/to/config.yaml DockerfileЧтобы передать пользовательский файл конфигурации (используя относительный или абсолютный путь) в контейнер, используйте следующую команду:
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 < DockerfileВ дополнение к файлам конфигурации HadoLint может быть настроен с переменными среды.
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 При использовании базовых изображений с непосиксными оболочками в качестве по умолчанию (например, изображения на основе Windows) специальная hadolint shell Pragma может указать, какую оболочку использует базовое изображение, так что HadoLint может автоматически игнорировать все правила, специфичные для оболочки.
FROM mcr.microsoft.com/windows/servercore:ltsc2022
# hadolint shell=powershell
RUN Get-Process notepad | Stop-Process Также можно игнорировать правила, добавив специальный комментарий непосредственно над оператором DockerFile, для которого вы хотите сделать исключение. Такие комментарии выглядят как # hadolint ignore=DL3001,SC1081 . Например:
# hadolint ignore=DL3006
FROM ubuntu
# hadolint ignore=DL3003,SC1035
RUN cd /tmp && echo "hello!"Комментарий «Inline игнорирует» относится только к утверждению после него.
Правила также могут быть проигнорированы на основе для каждого файла с использованием глобального игнорирования прагмы. Это работает так же, как встроенные игнорирование, за исключением того, что он относится ко всему файлу, а не только к следующей строке.
# hadolint global ignore=DL3003,DL3006,SC1035
FROM ubuntu
RUN cd /tmp && echo "foo" HadoLint может проверить, присутствуют ли конкретные этикетки и соответствовать предопределенной схеме метки. Во -первых, схема метки должна быть определена либо через командную строку:
hadolint --require-label author:text --require-label version:semver Dockerfileили через файл конфигурации:
label-schema :
author : text
contact : email
created : rfc3339
version : semver
documentation : url
git-revision : hash
license : spdx Значение метки может быть либо из text , url , semver , hash или rfc3339 :
| Схема | Описание |
|---|---|
| текст | Что-либо |
| RFC3339 | Время, отформатированное в соответствии с RFC 3339 |
| Семвер | Семантическая версия |
| URL | URI, как описано в RFC 3986 |
| хэш | Либо короткий, либо длинный хэш GIT |
| SPDX | Идентификатор лицензии SPDX |
| электронная почта | Адрес электронной почты, соответствующий RFC 5322 |
По умолчанию HadoLint игнорирует любую метку, которая не указана в схеме метки. Чтобы предупредить от таких дополнительных метков, включите строгие этикетки, используя командную строку:
hadolint --strict-labels --require-label version:semver Dockerfileили файл конфигурации:
strict-labels : true Когда строгие этикетки включены, но схема метки не указана, hadolint предупреждает, присутствует ли какой -либо метку.
Это общий шаблон для заполнения значения метки не статически, а скорее динамически во время сборки, используя переменную:
FROM debian:buster
ARG VERSION= "du-jour"
LABEL version= "${VERSION}" Чтобы разрешить это, схема метки должна указать text как значение для этой метки:
label-schema :
version : text Чтобы получить большую часть hadolint , полезно интегрировать его в качестве проверки в ваш CI или в ваш редактор, или в качестве крючка перед набором, чтобы прокинуть свой Dockerfile , когда вы его пишете. Смотрите наши интеграционные документы.
Неполный список реализованных правил. Нажмите на код ошибки, чтобы получить более подробную информацию.
Правила с префиксом DL из hadolint . Посмотрите на Rules.hs , чтобы найти реализацию правил.
Правила с префиксом SC от ShellCheck (перечислены только наиболее распространенные правила, их еще десятки).
Пожалуйста, создайте проблему, если у вас есть идея для хорошего правила.
| Правило | Строгость по умолчанию | Описание |
|---|---|---|
| DL1001 | Игнорировать | Пожалуйста, воздержитесь от использования Inline игнорировать Pragmas # hadolint ignore=DLxxxx . |
| DL3000 | Ошибка | Используйте Absolute Workdir. |
| DL3001 | Информация | Для некоторых команд Bash не имеет смысла запускать их в контейнере Docker, таком как SSH, VIM, выключение, обслуживание, PS, бесплатно, топ, убить, крепление, ifconfig. |
| DL3002 | Предупреждение | Последний пользователь не должен быть корнем. |
| DL3003 | Предупреждение | Используйте Workdir, чтобы переключиться на каталог. |
| DL3004 | Ошибка | Не используйте Sudo, поскольку это приводит к непредсказуемому поведению. Используйте такой инструмент, как Gosu, чтобы обеспечить соблюдение корня. |
| DL3006 | Предупреждение | Всегда отмечайте версию изображения явно. |
| DL3007 | Предупреждение | Использование последнего склонна к ошибкам, если изображение когда -либо обновит. Прикрепите версию явно к тег. |
| DL3008 | Предупреждение | Версии PIN в apt-get install . |
| DL3009 | Информация | Удалите списки APT-GET после установки чего-либо. |
| DL3010 | Информация | Используйте добавить для извлечения архивов в изображение. |
| DL3011 | Ошибка | Допустимые порты Unix варьируются от 0 до 65535. |
| DL3012 | Ошибка | Многочисленные инструкции HEALTHCHECK . |
| DL3013 | Предупреждение | PIN -версии в PIP. |
| DL3014 | Предупреждение | Используйте переключатель -y . |
| DL3015 | Информация | Избегайте дополнительных пакетов, указав --no-install-recommends . |
| DL3016 | Предупреждение | PIN -версии в npm . |
| DL3018 | Предупреждение | Версии PIN в apk add . Вместо apk add <package> Используйте apk add <package>=<version> . |
| DL3019 | Информация | Используйте переключатель --no-cache чтобы избежать необходимости использования --update и удалить /var/cache/apk/* при завершении установки пакетов. |
| DL3020 | Ошибка | Используйте COPY вместо ADD для файлов и папок. |
| DL3021 | Ошибка | COPY с более чем 2 аргументами, требует, чтобы последний аргумент закончился / |
| DL3022 | Предупреждение | COPY --from -за того, что он должен FROM |
| DL3023 | Ошибка | COPY --from не может ссылаться на свой собственный FROM |
| DL3024 | Ошибка | FROM псевдонимов (имен на сцене) должны быть уникальными |
| DL3025 | Предупреждение | Используйте аргументы JSON. |
| DL3026 | Ошибка | Используйте только разрешенный реестр на FROM image |
| DL3027 | Предупреждение | Не используйте apt , так как он должен быть инструментом конечного пользователя, используйте apt-get или apt-cache вместо этого |
| DL3028 | Предупреждение | Версии PIN в Gem Install. Вместо gem install <gem> используйте gem install <gem>:<version> |
| DL3029 | Предупреждение | Не используйте -платформный флаг с. |
| DL3030 | Предупреждение | Используйте переключатель -y , чтобы избежать ручного входа yum install -y <package> |
| DL3032 | Предупреждение | yum clean all отсутствуют после команды Yum. |
| DL3033 | Предупреждение | Укажите версию с помощью yum install -y <package>-<version> |
| DL3034 | Предупреждение | Неинтерактивный переключатель отсутствует в команде zypper : zypper install -y |
| DL3035 | Предупреждение | Не используйте zypper dist-upgrade . |
| DL3036 | Предупреждение | zypper clean отсутствует после использования Zypper. |
| DL3037 | Предупреждение | Укажите версию с помощью zypper install -y <package>[=]<version> . |
| DL3038 | Предупреждение | Используйте переключатель -y , чтобы избежать ручного ввода dnf install -y <package> |
| DL3040 | Предупреждение | dnf clean all отсутствующие после команды DNF. |
| DL3041 | Предупреждение | Укажите версию с помощью dnf install -y <package>-<version> |
| DL3042 | Предупреждение | Избегайте каталога кеша с pip install --no-cache-dir <package> . |
| DL3043 | Ошибка | ONBUILD , FROM или MAINTAINER запускаемых изнутри ONBUILD . |
| DL3044 | Ошибка | Не ссылайтесь на переменную среды в том же операторе ENV , где она определена. |
| DL3045 | Предупреждение | COPY в относительный пункт назначения без набора WORKDIR . |
| DL3046 | Предупреждение | useradd без флага -l и High UID приведет к чрезмерно большему изображению. |
| DL3047 | Информация | wget без флага --progress приведет к чрезмерно раздутым журналам сборки при загрузке больших файлов. |
| DL3048 | Стиль | Неверный ключ ярлыка |
| DL3049 | Информация | Метка <label> отсутствует. |
| DL3050 | Информация | Излишнее этикетка (ы) присутствует. |
| DL3051 | Предупреждение | Метка <label> пуста. |
| DL3052 | Предупреждение | Метка <label> не является действительным URL. |
| DL3053 | Предупреждение | Метка <label> не является действительным форматом времени - должен соответствовать RFC3339. |
| DL3054 | Предупреждение | Метка <label> не является действительным идентификатором лицензии SPDX. |
| DL3055 | Предупреждение | Метка <label> не является действительным git hash. |
| DL3056 | Предупреждение | Label <label> не соответствует семантической версии. |
| DL3057 | Игнорировать | Отсутствие инструкции HEALTHCHECK отсутствует. |
| DL3058 | Предупреждение | Метка <label> не является действительным форматом электронной почты - должен соответствовать RFC5322. |
| DL3059 | Информация | Несколько последовательных инструкций RUN . Рассмотрим консолидацию. |
| DL3060 | Информация | yarn cache clean отсутствующим после yarn install была запущена. |
| DL3061 | Ошибка | Неверный заказ на инструкции. Dockerfile должен начать с FROM или Comment ARG |
| DL4000 | Ошибка | MAINTAINER устарело. |
| DL4001 | Предупреждение | Либо используйте Wget или Curl, но не оба. |
| DL4003 | Предупреждение | Многочисленные инструкции CMD найдены. |
| DL4004 | Ошибка | Найдено несколько инструкций ENTRYPOINT . |
| DL4005 | Предупреждение | Используйте SHELL , чтобы изменить оболочку по умолчанию. |
| DL4006 | Предупреждение | Установите опцию SHELL -o Pipefail, прежде чем RUN с трубой в нем |
| SC1000 | $ не используется специально и поэтому следует избежать. | |
| SC1001 | Этот c будет обычным 'c' в этом контексте. | |
| SC1007 | Удалить пространство после = если попытаться назначить значение (или для пустой строки, используйте var='' ... ). | |
| SC1010 | Используйте Semicolon или Linefeed перед done (или цитируйте, чтобы сделать его буквальным). | |
| SC1018 | Это не разрушающее пространство Unicode. Удалить его и переписать как пространство. | |
| SC1035 | Вам нужно место здесь | |
| SC1045 | Это не foo &; bar , просто foo & bar . | |
| SC1065 | Пытаетесь объявить параметры? Не. Используйте () и обратитесь к Params как $1 , $2 . США и т. Д. | |
| SC1066 | Не используйте $ в левой стороне заданий. | |
| SC1068 | Не помещайте места вокруг = в заданиях. | |
| SC1077 | Для расширения команд, клеща должна наклониться влево (`vs ´). | |
| SC1078 | Вы забыли закрыть эту строку с двойным цитированием? | |
| SC1079 | Это на самом деле конечная цитата, но из -за следующего Чар, она выглядит подозреваемая. | |
| SC1081 | Сценарии чувствительны к корпусу. Используйте, if не If . | |
| SC1083 | Это {/} буквально. Проверьте выражение (отсутствует ;/n ?) Или цитируйте его. | |
| SC1086 | Не используйте $ на имя итератора для петли. | |
| SC1087 | Брекеты необходимы при расширении массивов, как в ${array[idx]} . | |
| SC1095 | Вам нужно пространство или линейное устройство между именем функции и телом. | |
| SC1097 | Неожиданно == . Для назначения, используйте = . Для сравнения, используйте [ .. ] или [[ .. ]] . | |
| SC1098 | Цитата/избежать специальных символов при использовании eval , например, eval "a=(b)" . | |
| SC1099 | Вам нужно место перед # . | |
| SC2002 | Бесполезный кот. Рассмотрим cmd < file | .. или cmd file | .. вместо. | |
| SC2015 | Обратите внимание, что A && B || C не если-то-эльсе. C может работать, когда A правда. | |
| SC2026 | Это слово находится за пределами цитат. Вы собирались «гнездо» «сингл цитаты» «» вместо этого '? | |
| SC2028 | echo не будет расширять последовательности побега. Рассмотрим printf . | |
| SC2035 | Используйте ./*glob* или -- *glob* Так что имена с тире не станут вариантами. | |
| SC2039 | В Posix SH что -то не определен. | |
| SC2046 | Цитируйте это, чтобы предотвратить расщепление слов | |
| SC2086 | Двойная цитата, чтобы предотвратить глобусное и разделение слов. | |
| SC2140 | Слово находится в форме "A"B"C" (B указано). Вы имели в виду "ABC" или "A"B"C" ? | |
| SC2154 | VAR ссылается, но не назначается. | |
| SC2155 | Объявить и назначить отдельно, чтобы избежать маскировки возврата значений. | |
| SC2164 | Используйте cd ... || exit на случай, если cd не удается. |
Если вы опытный Haskeller, мы были бы очень благодарны, если бы вы разорвали наш код на части в обзоре.
Для компиляции вам понадобится недавняя среда Haskell и cabal-install .
Репозиторий клона
git clone --recursive [email protected]:hadolint/hadolint.gitУстановите зависимости и компиляцию источника
cabal configure
cabal build(Необязательно) Установите Hadolint в вашу систему
cabal installСамый простой способ попробовать анализатор - это использовать реплику.
# 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 "Скомпилируйте модульные тесты и запустите их:
cabal configure --enable-tests
cabal build --enable-tests
cabal testЗапустить интеграционные тесты:
./integration_test.sh Синтаксис DockerFile полностью описан в ссылке DockerFile. Просто посмотрите на Syntax.hs в проекте language-docker чтобы увидеть определение AST.
HadoLint использует много библиотек, чтобы выполнить грязную работу. В частности, языковой докер используется для анализа Dockerfiles и производства AST, который затем может быть проанализирован. Чтобы построить хадолин против пользовательской версии таких библиотек, сделайте следующее. В этом примере используется языковой докер, но он будет работать и с любой другой библиотекой.
/home/user/repos ) клон HadoLint и языковые репозитории GIT GIT cd /home/user/repos
git clone https://github.com/hadolint/hadolint.git
git clone https://github.com/hadolint/language-docker.gitВнесите свои модификации в языковом докере
В hadoLint Repo, отредактируйте файл cabal.project , так что свойство packages также указывает на другое репо.
[...]
packages :
.
../language-docker
[...] cd /home/user/repos/hadolint
cabal configure --enable-tests
cabal build --enable-tests
cabal test ReplicatedHQ/DockerFileLelint, другой линтер, используемый Super-Linter
Redcoolbeans/Dockerlint
Projectatomic/dockerfile_lint