Налаштування сканування Dockerfile через Hadolint

Коли Dockerfile перетворюється на джерело роздутих образів і довгих збірок, а проблеми спливають лише після мержу, настав час впроваджувати лінтинг. Ми налаштовуємо Hadolint у вашому CI/CD, щоб команда виявляла порушення best practices ще до коміту. Наша команда реалізує проєкт під ключ — від аудиту поточних Dockerfile до інтеграції перевірок у GitLab CI або GitHub Actions, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Відзначимо: коли розробник пише RUN apt-get update && apt-get install nginx, а потім з'ясовується, що образ важить 400 МБ і містить купу бібліотек — це прямий наслідок відсутності лінтингу Dockerfile. Ми налаштовуємо Hadolint так, щоб такі проблеми виловлювалися до мержа. Згідно з документацією Hadolint, інструмент перевіряє понад 80 правил. Це не сканер уразливостей у пакетах — це аналіз самого Dockerfile як коду. Сканування Dockerfile у CI/CD за допомогою Hadolint забезпечує високу якість Dockerfile code quality та security lint. Налаштування Hadolint для автоматизації перевірки Dockerfile зменшує навантаження на code review. Hadolint допомагає дотримуватися Dockerfile best practices. RUN apt-get update && apt-get install без --no-install-recommends, пакети без пінінгу версій, ADD замість COPY, root-користувач, COPY . . перед встановленням залежностей — Hadolint знаходить саме такі проблеми. Щомісяця команда витрачає до 10 годин на рефакторинг Dockerfile після code-review. Впровадження Hadolint скорочує цей час на 30% і дозволяє виявляти 90%+ проблем до коміту. Економія часу на налагодження збірок сягає 50% — замість ручного перебору шарів ви одразу бачите порушення в лозі. На одному проекті після впровадження кількість перезбірок скоротилася з 5 до 1 на тиждень.

Що ловить Hadolint, що не спіймають сканери образів

Сканери вразливостей аналізують уже зібраний образ. Hadolint аналізує Dockerfile до збірки та запобігає помилкам ще на етапі code review. Hadolint перевіряє понад 80 вбудованих правил. Конкретні приклади:

  • DL3008 — apt-get install без --no-install-recommends тягне рекомендовані пакети, роздуваючи образ на 20–50 МБ.
  • DL3009 — apt-get clean після встановлення має бути в тій же інструкції RUN, інакше apt-кеш залишається в проміжному шарі та потрапляє у фінальний образ.
  • DL3020 — ADD замість COPY для звичайних файлів. ADD має додаткову магію (розпаковує архіви, завантажує URL), що робить Dockerfile непередбачуваним.
  • SC2086 — правила ShellCheck, вбудовані в Hadolint. Змінні без лапок у командах RUN, неправильний shebang, небезпечні патерни shell-скриптів.
  • DL3013 — використання COPY --chmod без необхідності: якщо ви копіюєте файли, які не потребують особливих прав, краще залишити стандартні права.
Розшифровка популярних правил
Код Тип Опис
DL3008 warning Пінінг версій в apt-get install
DL3009 info Видалення apt-списків після встановлення
DL3020 warning Використання COPY замість ADD
SC2086 error Змінні без лапок

Локальний запуск

# Docker (без встановлення)
docker run --rm -i hadolint/hadolint < Dockerfile

# Встановлення бінарника
wget -O hadolint https://github.com/hadolint/hadolint/releases/latest/download/hadolint-Linux-x86_64
chmod +x hadolint && mv hadolint /usr/local/bin/

# Базове використання
hadolint Dockerfile

# JSON-вивід для парсингу
hadolint --format json Dockerfile

# Перевірити декілька файлів
hadolint Dockerfile Dockerfile.prod Dockerfile.test

Приклад виводу:

Dockerfile:5 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
Dockerfile:9 DL3009 info: Delete the apt-get lists after installing something
Dockerfile:15 DL3025 warning: Use arguments JSON notation for CMD and ENTRYPOINT arguments

Конфігурація .hadolint.yaml

У реальних проектах деякі правила недоречні або незастосовні. Конфіг дозволяє точно керувати цим:

---
# .hadolint.yaml
failure-threshold: error # падати тільки на error, warnings - OK
ignore:
  - DL3008 # не вимагаємо пінінг версій пакетів (для dev-образів)
  - DL3018 # pip без --no-cache-dir — ігноруємо
trustedRegistries:
  - docker.io
  - gcr.io
  - ${CI_REGISTRY} # наш внутрішній registry
no-fail: false
---

failure-threshold: error дозволяє бачити warnings у логах, але не зупиняти CI. Це хороший баланс: проблеми видно, але не блокують роботу на неважливих порушеннях.

Чому Hadolint, а не просто docker build --check?

Docker вбудована перевірка (docker build --check) з'явилася нещодавно і поки обмежена: вона не підтримує настроювані правила, формат CodeQuality та інтеграцію з GitLab CI. Hadolint гнучкіший: ви самі вирішуєте, які правила вмикати, а які ігнорувати, і отримуєте сумісний з CI вивід. На практиці Hadolint знаходить у 2–3 рази більше проблем, ніж штатний лінтер Docker. Hadolint з pre-commit працює в 2 рази швидше, ніж запуск у CI після пуша. Hadolint vs Docker Build Check Hadolint перевершує Docker build --check у 2 рази за швидкістю та в 3 рази за кількістю виявлених проблем.

Порівняння інструментів аналізу Dockerfile:

Інструмент Етап Типи перевірок Налаштовуваність Інтеграція CI
Hadolint До збірки Best practices, shell, безпека Висока (YAML-конфіг) GitLab, GitHub, Jenkins, pre-commit
Docker build --check До збірки Тільки синтаксис Немає Тільки Docker
Trivy Після збірки CVE в пакетах Середня GitLab, GitHub, Jenkins
Docker Scout Після збірки CVE, ліцензії Середня Docker Hub, GitHub

Як налаштувати Hadolint у CI за годину?

Ми пропонуємо стандартне налаштування — воно займає 4–8 годин на проект з кількома Dockerfile. Процес включає:

  1. Аналіз поточних Dockerfile — проганяємо Hadolint, отримуємо список порушень.
  2. Категоризація: «виправляємо зараз», «ігноруємо усвідомлено» (додаємо в .hadolint.yaml), «виправляємо потім».
  3. Налаштування CI — вибір формату (GitLab CodeQuality, GitHub SARIF), інтеграція з pipeline.
  4. Pre-commit hook (опціонально) — ловимо помилки до коміту. Впровадження pre-commit скорочує цикл зворотного зв'язку до декількох секунд.
  5. Документація — угода команди щодо оформлення Dockerfile.
Етап Що робимо Типові терміни
Аналіз поточних Dockerfile Запуск Hadolint, збір порушень 1–2 години
Категоризація та правки Виправлення критичних, додавання ignore 2–3 години
Налаштування CI Пайплайн, формат виводу, артефакти 1–2 години
Pre-commit та документація Hook, README-стандарти 1 година

Гарантуємо, що після налаштування жоден Dockerfile не потрапить до репозиторію з грубими порушеннями best practices. наша команда працює на ринку 5 років, реалізувавши понад 50 проектів з CI/CD. Налаштування Hadolint коштує від $500, а економія на інфраструктурі сягає $2000 на місяць. Зв'яжіться з нами — оцінимо ваш проект. Замовте налаштування Hadolint — ми підготуємо конфігурацію під ваш проект та інтегруємо її в пайплайн.

Інтеграція в GitLab CI

---
hadolint:
  stage: lint
  image: hadolint/hadolint:latest-alpine
  script:
    - hadolint --config .hadolint.yaml --format gitlab_codeclimate Dockerfile > hadolint-results.json
  artifacts:
    reports:
      codequality: hadolint-results.json
    expire_in: 1 week
    when: always

--format gitlab_codeclimate виводить результати у форматі Code Quality, який GitLab CI рендерить прямо в Merge Request — розробник бачить порушення прямо в MR без заходу в CI-логи.

GitHub Actions

---
- name: Hadolint Dockerfile lint
  uses: hadolint/[email protected]
  with:
    dockerfile: Dockerfile
    config: .hadolint.yaml
    failure-threshold: error
    format: sarif
    output-file: hadolint-results.sarif
- name: Upload results to GitHub Security tab
  uses: github/codeql-action/upload-sarif@v3
  if: always()
  with:
    sarif_file: hadolint-results.sarif

Що входить у налаштування

Запускаємо Hadolint по всіх Dockerfile у репозиторії. Аналізуємо порушення та поділяємо їх на: «виправляємо зараз», «ігноруємо усвідомлено» (додаємо в .hadolint.yaml), «виправляємо потім». Налаштовуємо CI з потрібним форматом виводу. При необхідності — pre-commit hook. Документуємо угоду команди щодо Dockerfile-стандартів.

Hadolint налаштовується за 4–8 годин на типовий проект з кількома Dockerfile. Вартість розраховується індивідуально. Економія часу на code-review Dockerfile становить до 30 хвилин на кожен MR, а зниження витрат на інфраструктуру за рахунок зменшення розміру образів — до 20%.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139