Відзначимо: коли розробник пише 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. Процес включає:
- Аналіз поточних Dockerfile — проганяємо Hadolint, отримуємо список порушень.
- Категоризація: «виправляємо зараз», «ігноруємо усвідомлено» (додаємо в .hadolint.yaml), «виправляємо потім».
- Налаштування CI — вибір формату (GitLab CodeQuality, GitHub SARIF), інтеграція з pipeline.
- Pre-commit hook (опціонально) — ловимо помилки до коміту. Впровадження pre-commit скорочує цикл зворотного зв'язку до декількох секунд.
- Документація — угода команди щодо оформлення 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%.







