Перейти к содержанию

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 сразу.

Источник

Как применить у себя

  1. Добавить .pre-commit-config.yaml с хуком hadolint-docker.
  2. pre-commit install в dev-машинах + pre-commit run --all-files для бэкфилла.
  3. Зафиксировать minimum severity в командных правилах (warning — оптимум).
  4. После прохождения первого «чистого» CI-билда с включённым hook — пометить Изучено.