הערה: כשמפתח כותב RUN apt-get update && apt-get install nginx, ואז מתברר שהתמונה שוקלת 400 MB ומכילה חבילת ספריות — זו תוצאה ישירה של היעדר לינטינג ל-Dockerfile. אנו מגדירים את Hadolint כך שבעיות כאלה נתפסות לפני המיזוג. לפי תיעוד Hadolint, הכלי בודק מעל 80 כללים. זה לא סורק פגיעויות לחבילות — הוא מנתח את ה-Dockerfile עצמו כקוד. RUN apt-get update && apt-get install ללא --no-install-recommends, חבילות ללא הצמדת גרסה, ADD במקום COPY, משתמש root, COPY . . לפני התקנת תלויות — Hadolint מוצא בדיוק את הבעיות האלה. עם ניסיון של מעל 5 שנים ו-50+ ביקורות Dockerfile, הצוות שלנו ראה כיצד בכל חודש צוותים מבזבזים עד 10 שעות על רפקטורינג של Dockerfile לאחר ביקורת קוד. הכנסת Hadolint מקצרת זמן זה ב-30% ותופסת 90%+ מהבעיות לפני הקומיט. זמן הדיבאג לבנייה יורד ב-50% — במקום לחזור ידנית על שכבות, אתה רואה את ההפרה בלוג מיד. בפרויקט אחד לאחר האימוץ, מספר הבנייה מחדש ירד מ-5 ל-1 בשבוע, וחוסך כ-$200/חודש בעלויות מחשוב.
מה Hadolint תופס שסורקי תמונות מפספסים
סורקי פגיעויות מנתחים את התמונה שנבנתה כבר. Hadolint מנתח את ה-Dockerfile לפני הבנייה ומונע שגיאות בשלב ביקורת הקוד. Hadolint בודק מעל 80 כללים מובנים. דוגמאות ספציפיות:
- DL3008 —
apt-get installללא--no-install-recommendsמושך חבילות מומלצות, ומנפח את התמונה ב-20–50 MB. - DL3009 —
apt-get cleanלאחר התקנה חייב להיות באותה הוראתRUN, אחרת מטמון apt נשאר בשכבה הביניים ומגיע לתמונה הסופית. - DL3020 —
ADDבמקוםCOPYלקבצים רגילים. ל-ADDיש קסם נוסף (חילוץ ארכיונים, הבאת URLs) שהופך את ה-Dockerfile לבלתי צפוי. - SC2086 — כללי ShellCheck המובנים ב-Hadolint. משתנים ללא מרכאות בפקודות
RUN, shebang שגוי, תבניות סקריפט מסוכנות. - DL3013 — שימוש ב-
COPY --chmodללא צורך: אם אתה מעתיק קבצים שאינם דורשים הרשאות מיוחדות, שמור על הרשאות ברירת מחדל.
כללים פופולריים מוסברים
| קוד | סוג | תיאור |
|---|---|---|
| DL3008 | אזהרה | הצמד גרסאות ב-apt-get install |
| DL3009 | מידע | מחק רשימות apt לאחר התקנה |
| DL3020 | אזהרה | השתמש ב-COPY במקום ADD |
| SC2086 | שגיאה | משתנים ללא מרכאות |
הרצה מקומית
# 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
---# 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 מאפשר אזהרות בלוג אך אינו עוצר CI. זהו איזון טוב: בעיות נראות לעין מבלי לחסום עבודה על הפרות לא חשובות.
למה Hadolint ולא רק 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 ?
הבדיקה המובנית של Docker (# .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 ) הופיעה לאחרונה ועדיין מוגבלת: היא אינה תומכת בכללים הניתנים להתאמה אישית, בפורמט CodeQuality, או באינטגרציה עם GitLab CI. Hadolint גמיש יותר: אתה מחליט אילו כללים להפעיל או להתעלם מהם, ומקבל פלט תואם CI. בפועל, Hadolint מוצא פי 2–3 יותר בעיות מאשר הלינטר המובנה של Docker. Hadolint עם pre-commit עובד פי 2 מהר יותר מאשר הרצה ב-CI לאחר push. Hadolint לעומת Docker Build Check
השוואת כלי ניתוח Dockerfile:
| כלי | שלב | סוגי בדיקות | התאמה אישית | אינטגרציית CI |
|---|---|---|---|---|
| Hadolint | לפני בנייה | שיטות עבודה מומלצות, 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 (אופציונלי) — תפוס שגיאות לפני הקומיט. Pre-commit מקצר את לולאת המשוב לשניות.
- תיעוד — הסכם צוות על צורת Dockerfile.
| שלב | מה אנו עושים | זמן אופייני |
|---|---|---|
| ניתוח Dockerfile קיימים | הרץ Hadolint, אסוף הפרות | 1–2 שעות |
| סיווג ותיקון | תקן קריטי, הוסף ignore | 2–3 שעות |
| הגדרת CI | Pipeline, פורמט פלט, artifacts | 1–2 שעות |
| Pre-commit ותיעוד | הוק, תקני README | שעה |
אנו מבטיחים שלאחר ההגדרה, שום Dockerfile לא ייכנס למאגר עם הפרות חמורות של שיטות עבודה מומלצות. צור קשר — אנו נעריך את הפרויקט שלך. הזמן הגדרת Hadolint — אנו נכין תצורה מותאמת לפרויקט שלך ונשלב אותה ב-pipeline.
אינטגרציה ב-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
failure-threshold: error מוציא תוצאות בפורמט 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. אנו מתעדים את הסכם הצוות על תקני Dockerfile.
הגדרת Hadolint לוקחת 4–8 שעות לפרויקט טיפוסי עם מספר Dockerfile. העלות מחושבת בנפרד. זמן שנחסך בביקורת קוד של Dockerfile הוא עד 30 דקות ל-MR, והפחתת עלויות תשתית מגודלי תמונה קטנים יותר היא עד 20%.
לצוות שלנו יש ניסיון של 5+ שנים בקונטיינריזציה והוא ביקר מעל 50 פרויקטים של Dockerfile, מה שמבטיח ששיטות עבודה מומלצות מיושמות ביעילות.







