Как использовать Hadolint для проверки ваших файлов Docker
Файлы Docker определяют содержимое образов Docker как набор инструкций в текстовом файле. Синтаксис Dockerfile, как правило, прост, но есть некоторые ошибки, которых следует избегать. Придерживаться лучших практик при написании сложных файлов Docker в коллективе может быть сложно, если только вы не проверяете содержимое файла автоматически.
Hadolint — это линтер Dockerfile, который может выявить распространенные проблемы. Он использует абстрактное синтаксическое дерево (AST) для анализа вашего файла Dockerfile на соответствие предопределенным наборам правил. Hadolint также включает в себя ShellCheck, поэтому он также может анализировать сценарии оболочки в инструкциях RUN
вашего Dockerfile.
Начиная
Линтинг Dockerfile
Передайте Hadolint путь к Dockerfile, чтобы начать новое сканирование:
hadolint Dockerfile
Если вы используете Dockerized-версию, проще всего передать содержимое вашего файла в контейнер Hadolint:
docker run --rm -i hadolint/hadolint < Dockerfile
Что ищет Хадолинт?
В Hadolint есть десятки встроенных правил, которые проверяют распространенные проблемы с конфигурацией и безопасностью. Линтер стремится сделать ваши файлы Dockerfile совместимыми с рекомендациями по созданию образов, предложенными Docker.
Включенные проверки охватывают использование конечными пользователями без полномочий root, ссылку на относительный путь в операторе WORKDIR
, добавление нескольких инструкций HEALTHCHECK
и отказ от использования явно закрепленных тегов и версий. Поскольку Hadolint также наследует набор правил ShellCheck, он выявляет распространенные проблемы сценариев Bash, которые также определяет этот инструмент.
Правила идентифицируются как числа с префиксом HL
или SC
. Правила HL
являются частью Hadolint, тогда как записи SC
поступают из ShellCheck. Каждой проверке присваивается серьезность от Error до Info. Если вы получаете ошибки в результатах сканирования, это должны быть первые проблемы, которые вы решаете.
Настройка конфигурации
Hadolint настраивается с помощью файла .hadolint.yaml
. Он будет искать в нескольких местах, включая ваши рабочие, .config
и домашние каталоги. Используется только первый найденный файл — слияния между локациями нет.
Файл конфигурации позволяет настраивать сканирование, игнорируя правила и изменяя их серьезность. Хотя набор правил по умолчанию охватывает рекомендуемые передовые практики, вы можете обнаружить, что некоторые проверки неприменимы в вашей среде. Отправка файла .hadolint.yaml
вместе с файлом Dockerfile позволяет соответствующим образом адаптировать сканирование Hadolint. Большинство полей файла конфигурации также поддерживаются как флаги CLI и переменные среды.
Правила отключены полем ignored
. Это должен быть список идентификаторов правил:
ignored: - DL3010 - DL3020
Если вам нужно снизить серьезность правила, не отключая его полностью, вместо этого используйте клавишу override
. Это также позволяет поднять проблему с низким уровнем серьезности до более высокого уровня. Используйте это, если хотите сделать больший акцент на конкретном вопросе.
override: warning: - DL3020
Это понизит правило DL3020 с уровня «ошибка» по умолчанию до менее серьезного «предупреждения». Это правило требует, чтобы вы использовали COPY
вместо ADD
при ссылке на файлы и папки в контексте сборки.
Вы также можете настроить глобальный уровень серьезности. Установка поля failure-threshold
указывает Hadolint выйти со статусом сбоя, если какой-либо тест сообщает об ошибке с заданным уровнем серьезности:
failure-threshold: warning
Эта инструкция означает, что сканирование Hadolint завершится ошибкой, если в его выводе будет ошибка или предупреждение.
Вы можете отключить выход с кодом ошибки, используя параметр конфигурации no-fail: true
или флаг CLI --no-fail
. Это заставит Hadolint выйти с кодом 0
независимо от фактического результата теста. Это может быть полезно, если вы хотите включить Hadolint в качестве неблокирующего задания в конвейер CI.
Доверительные реестры
Другое использование файла конфигурации — определение доверенных реестров, на которые вы хотите иметь возможность ссылаться в своих файлах Docker. Когда поле trustedRegistries
установлено, Hadolint будет предупреждать вас, когда используется образ из другого реестра:
trustedRegistries: - docker.io - docker-registry.example.com
Схемы этикеток
Hadolint также предлагает базовый линтинг этикеток. Это позволяет вам обеспечить, чтобы метки, добавленные к вашему образу с помощью инструкций Dockerfile LABEL
, соответствовали указанным ограничениям. Вот пример того, как это работает:
label-schema: notes: text app-version: semver built-at: rfc3339
Этот фрагмент конфигурации определяет типы данных для четырех меток, которые вы можете использовать в своем Dockerfile. notes
объявляется как произвольное текстовое поле, а app-version
должен быть идентификатором версии, совместимой с semver. встроенный
помечен как строка даты и времени RFC-3339. Вы можете получить полный список поддерживаемых типов в документации Hadolint.
Hadolint разрешает использовать метки, не указанные в вашей схеме. Вы можете отключить это и ограничить инструкции LABEL
только теми, которые присутствуют в схеме, установив strict-labels: true
или используя --strict-labels
флаг.
Выходные форматы
Несколько выходных форматов поддерживаются с помощью параметра format
или флага --format
. По умолчанию используется tty
, который выводит раскрашенный вывод на ваш терминал. Цвета можно отключить с помощью флага --no-color
.
Доступны следующие альтернативные средства форматирования:
json
— предоставляет список обнаруженных проблем в виде подробной структуры JSON, которая идеально подходит для использования с вашими собственными скриптами.checkstyle
— отчет, совместимый с Checkstyle.codeclimate
— отчет, совместимый с Code Climate.gitlab_codeclimate
— вариант отчета Code Climate, который работает с интегрированными функциями качества кода GitLab. Это позволяет просматривать ошибки в виде виджета на страницах мерж-реквестов при запуске Hadolint с GitLab CI.
Эти форматы вывода идеально подходят для использования Hadolint программно или как часть конвейера непрерывной интеграции.
Краткое содержание
Hadolint автоматизирует обнаружение проблем с Dockerfile. Это помогает вашим образам Docker соответствовать лучшим практикам и организационным стандартам. Конфигурация по умолчанию является хорошей отправной точкой, но вы можете настроить ее в соответствии со своими потребностями, переклассифицируя и отключая правила.
Вам следует рассмотреть возможность интеграции Hadolint с вашим инструментом непрерывной интеграции, чтобы получать мгновенные отчеты по мере внесения изменений в Dockerfile. Это ускоряет проверку кода, предоставляя разработчикам немедленную видимость проблем. Вы также можете использовать этот инструмент локально во время работы с расширениями редактора, поддерживаемыми сообществом, что обеспечивает еще более короткий цикл обратной связи.