בודק Dockerfile

מדביקים Dockerfile ומקבלים ממצאים שאומרים מה לשנות ולמה, כל אחד עם הפניה לתיעוד של Docker עצמו. הקובץ נשאר בדפדפן, וסודות שבו ממוסכים.

נשאר רק בדפדפן שלך. מה שהדבקתם או בחרתם נקרא רק בעמוד הזה. הוא לא נשלח לשרת, לא נשמר בקישור או באחסון הדפדפן, ולעולם לא נכלל ב-analytics.

הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 256 KiB.

0 מתוך 256 KiB

ה-Linter רואה רק את ה-Dockerfile, ולכן התשובה קובעת איך ידווח ‎COPY .‎

מה הכלי עושה

הכלי קורא Dockerfile כמו ש-BuildKit קורא אותו, כולל שלבים, heredocs והמשכי שורה, ובודק אותו מול שנים-עשר כללים שנלקחו מה-best practices ומה-build checks של Docker עצמו: כאיזה משתמש ה-container רץ, איך images הבסיס מוצמדים, לאן סודות מגיעים, מה מורד בזמן ה-build ואיך, איך משתמשים ב-apt, כמה שכבות נוצרות, מה ‎COPY .‎ שולח, האם יש ל-image בדיקת בריאות, והאם התהליך הראשי מקבל אותות עצירה. כל ממצא מציין את הכלל, את השורה, למה זה חשוב ואיך מתקנים.

איך זה עובד

  1. הקובץ נקרא בעמוד הזה, עד 256 KiB, ‏10,000 שורות ו-2,000 הוראות. שום דבר לא נבנה, נמשך או מורץ, ואף כתובת URL בקובץ לא נפתחת.
  2. parser directives, הערות, המשכי שורה, heredocs, צורות exec ו-shell וה-ARGs שלפני FROM נקראים כמו ש-Docker קורא אותם. שורה ש-Docker היה דוחה עוצרת את הבדיקה, עם מספר השורה.
  3. כללים שרק ה-image הסופי חשוב להם (משתמש, בדיקת בריאות) בודקים את השלב הסופי, והשאר בודקים כל שלב. images הבסיס נקראים אחרי הצבת ה-ARGs הגלובליים.
  4. ערכים שנראים כמו סודות ממוסכים לפני שהם מוצגים, ואותו קובץ נותן תמיד אותה תוצאה.

דוגמה

‏Dockerfile קטן של Node.js עם בעיות נפוצות, כפי שה-Linter בודק אותו:

קלט
Dockerfile
FROM node:latest
WORKDIR /app
COPY . .
RUN npm ci
ENV API_TOKEN=tok-8f2b61c94d0e
EXPOSE 3000
CMD npm start

הממצאים שלו:

ממצאים

שגיאה0
גבוהה2
בינונית1
נמוכה2
מידע1

6 ממצאים: 0 שגיאה, 2 גבוהה, 1 בינונית, 2 נמוכה, 1 מידע.

גבוהה2

  1. גבוההAQ-DF-001שורה 1

    בשלב הסופי (מ-node:latest) אין USER, ולכן ה-container רץ כ-root, אלא אם ה-image הבסיסי מגדיר משתמש אחר.

    תיקון: ליצור משתמש בלי הרשאות (או להשתמש במשתמש שכבר יש ב-image, כמו node), לתת לו רק את הנתיבים שהוא כותב אליהם, ולהוסיף USER לפני CMD.

    מקור

  2. גבוההAQ-DF-004שורה 5

    ‏ENV API_TOKEN מגדיר סוד בתוך ה-Dockerfile עצמו (to•••): כל מי שיש לו את הקובץ או את ה-image יכול לקרוא אותו.

    תיקון: להסיר את הערך, להחליף אותו אם הוא כבר נכנס ל-commit, ולהעביר אותו בזמן build עם secret mount ‏(RUN --mount=type=secret) או בזמן ריצה כמשתנה סביבה או כקובץ.

    מקור

בינונית1

  1. בינוניתAQ-DF-002שורה 1

    ‏FROM node:latest עוקב אחרי latest.

    תיקון: להצמיד תג גרסה (python:3.13-slim), או digest ‏(@sha256:…) ל-builds שחייבים להיות ניתנים לשחזור.

    מקור

נמוכה2

  1. נמוכהAQ-DF-009שורה 3

    ‏COPY . מעתיק את כל ה-build context. כדאי לוודא ש-.dockerignore מחריג את .git, ‏.env ותוצרי build.

    תיקון: להוסיף .dockerignore ליד ה-Dockerfile (לפחות .git, ‏.env*, ‏node_modules ותוצרי build), או להעתיק רק את הקבצים שה-image צריך.

    מקור

  2. נמוכהAQ-DF-011שורה 7

    ‏CMD בצורת shell, ולכן התהליך לא מקבל אותות עצירה.

    תיקון: להשתמש בצורת exec, מערך JSON: ‏CMD ["node", "server.js"]. אם צריך shell, לסיים את הסקריפט ב-exec.

    מקור

מידע1

  1. מידעAQ-DF-010שורה 1

    ל-image הסופי אין HEALTHCHECK משלו.

    תיקון: להוסיף HEALTHCHECK שקורא ל-endpoint זול בכלי שיש ב-image ‏(wget -qO-, ‏curl -f), או HEALTHCHECK NONE אם הבריאות נבדקת במקום אחר.

    מקור

מגבלות

  • בדיקה סטטית: ה-image הבסיסי לא נמשך, ולכן ה-Linter לא יודע איזה משתמש הוא מגדיר, אם יש לו בדיקת בריאות, או מה ה-entrypoint שלו עושה.
  • images רשמיים של שרתים כמו PostgreSQL, ‏Redis, ‏nginx ו-httpd מתחילים כ-root בכוונה ועוברים למשתמש משלהם; כלל המשתמש root מדווח עליהם בכל זאת. עמוד הכללים מפרט את ה-false positives הידועים שנמצאו ב-Dockerfiles רשמיים.
  • רק ה-Dockerfile נקרא: ‏‎.dockerignore, ה-build context וסקריפטים ש-RUN מריץ לא נקראים.
  • זו לא סריקת פגיעויות: הכלי לא מפרט חבילות או CVEs ב-image.

מה כל כלל בודק, עם דוגמאות

להתחיל מ-Dockerfile שעובר את הבדיקה: מחולל ה-Dockerfile

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. Docker Docs: Dockerfile reference
  2. Docker Docs: Building best practices
  3. Docker Docs: Build checks
  4. Docker Docs: Build secrets
  5. Docker Docs: Build context and .dockerignore

עודכן

הצעד הבא

Docker Compose Analyzer

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה