Hadolint в pre-commit
Docker · CI
Проблема
Dockerfile ревьюят на глаз. Типичные ошибки просачиваются в main: apt-get install без --no-install-recommends, латестовые теги (FROM python:latest), ADD вместо COPY, RUN без чистки кэша, контейнер запускается от root. Потом образы раздуваются, CVE накапливаются, а security-review обнаруживает это через полгода.
Решение
Запускать hadolint автоматически через pre-commit — локально до коммита и в CI. Разработчик не может закоммитить Dockerfile, не прошедший линтер.
Пример
.pre-commit-config.yaml в корне репозитория:
repos:
- repo: https://github.com/hadolint/hadolint
rev: v2.13.0
hooks:
- id: hadolint-docker
args:
- --failure-threshold=warning
- --ignore=DL3008 # apt-get pinning — отключить, если используется own base
Установка и активация один раз на репо:
pip install pre-commit
pre-commit install
# Прогнать по уже существующим файлам
pre-commit run --all-files
В GitHub Actions / GitLab CI — тот же хук как отдельный job:
# .github/workflows/lint.yml
- uses: actions/checkout@v4
- uses: pre-commit/action@v3.0.1
Что ловит hadolint на реальном Dockerfile:
Dockerfile:3 DL3007 warning: Using latest is prone to errors
Dockerfile:5 DL3008 warning: Pin versions in apt-get install
Dockerfile:8 DL3009 info: Delete the apt-get lists after installing
Dockerfile:12 DL3025 warning: Use arguments JSON notation for CMD
Когда применять
- Любой репозиторий, где есть Dockerfile (от микросервиса до внутренней утилиты).
- В монорепе — один
.pre-commit-config.yamlпокрывает все Dockerfile сразу.
Источник
- veggiemonk/awesome-docker — раздел Linters
- hadolint/hadolint — правила DL* и их обоснование
- pre-commit.com — философия «fail fast, local first»
Как применить у себя
- Добавить
.pre-commit-config.yamlс хукомhadolint-docker. pre-commit installв dev-машинах +pre-commit run --all-filesдля бэкфилла.- Зафиксировать minimum severity в командных правилах (
warning— оптимум). - После прохождения первого «чистого» CI-билда с включённым hook — пометить Изучено.