בודק Dockerfile
מדביקים Dockerfile ומקבלים ממצאים שאומרים מה לשנות ולמה, כל אחד עם הפניה לתיעוד של Docker עצמו. הקובץ נשאר בדפדפן, וסודות שבו ממוסכים.
הדביקו את הטקסט, או בחרו קובץ מהמחשב. עד 256 KiB.
0 מתוך 256 KiB
מה הכלי עושה
הכלי קורא Dockerfile כמו ש-BuildKit קורא אותו, כולל שלבים, heredocs והמשכי שורה, ובודק אותו מול שנים-עשר כללים שנלקחו מה-best practices ומה-build checks של Docker עצמו: כאיזה משתמש ה-container רץ, איך images הבסיס מוצמדים, לאן סודות מגיעים, מה מורד בזמן ה-build ואיך, איך משתמשים ב-apt, כמה שכבות נוצרות, מה COPY . שולח, האם יש ל-image בדיקת בריאות, והאם התהליך הראשי מקבל אותות עצירה. כל ממצא מציין את הכלל, את השורה, למה זה חשוב ואיך מתקנים.
איך זה עובד
- הקובץ נקרא בעמוד הזה, עד 256 KiB, 10,000 שורות ו-2,000 הוראות. שום דבר לא נבנה, נמשך או מורץ, ואף כתובת URL בקובץ לא נפתחת.
- parser directives, הערות, המשכי שורה, heredocs, צורות exec ו-shell וה-ARGs שלפני FROM נקראים כמו ש-Docker קורא אותם. שורה ש-Docker היה דוחה עוצרת את הבדיקה, עם מספר השורה.
- כללים שרק ה-image הסופי חשוב להם (משתמש, בדיקת בריאות) בודקים את השלב הסופי, והשאר בודקים כל שלב. images הבסיס נקראים אחרי הצבת ה-ARGs הגלובליים.
- ערכים שנראים כמו סודות ממוסכים לפני שהם מוצגים, ואותו קובץ נותן תמיד אותה תוצאה.
דוגמה
Dockerfile קטן של Node.js עם בעיות נפוצות, כפי שה-Linter בודק אותו:
FROM node:latest
WORKDIR /app
COPY . .
RUN npm ci
ENV API_TOKEN=tok-8f2b61c94d0e
EXPOSE 3000
CMD npm start
הממצאים שלו:
ממצאים
6 ממצאים: 0 שגיאה, 2 גבוהה, 1 בינונית, 2 נמוכה, 1 מידע.
גבוהה2
- גבוההAQ-DF-001שורה 1
בשלב הסופי (מ-
node:latest) איןUSER, ולכן ה-container רץ כ-root, אלא אם ה-image הבסיסי מגדיר משתמש אחר.תיקון: ליצור משתמש בלי הרשאות (או להשתמש במשתמש שכבר יש ב-image, כמו
node), לתת לו רק את הנתיבים שהוא כותב אליהם, ולהוסיףUSERלפניCMD. - גבוההAQ-DF-004שורה 5
ENV API_TOKENמגדיר סוד בתוך ה-Dockerfile עצמו (to•••): כל מי שיש לו את הקובץ או את ה-image יכול לקרוא אותו.תיקון: להסיר את הערך, להחליף אותו אם הוא כבר נכנס ל-commit, ולהעביר אותו בזמן build עם secret mount (
RUN --mount=type=secret) או בזמן ריצה כמשתנה סביבה או כקובץ.
בינונית1
- בינוניתAQ-DF-002שורה 1
FROM node:latestעוקב אחריlatest.תיקון: להצמיד תג גרסה (
python:3.13-slim), או digest (@sha256:…) ל-builds שחייבים להיות ניתנים לשחזור.
נמוכה2
- נמוכהAQ-DF-009שורה 3
COPY .מעתיק את כל ה-build context. כדאי לוודא ש-.dockerignoreמחריג את.git, .envותוצרי build.תיקון: להוסיף
.dockerignoreליד ה-Dockerfile (לפחות.git, .env*, node_modulesותוצרי build), או להעתיק רק את הקבצים שה-image צריך. - נמוכהAQ-DF-011שורה 7
CMDבצורת shell, ולכן התהליך לא מקבל אותות עצירה.תיקון: להשתמש בצורת exec, מערך JSON:
CMD ["node", "server.js"]. אם צריך shell, לסיים את הסקריפט ב-exec.
מידע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.
מתודולוגיה: איך מחושבים המספרים
מקורות
קשורים
הצעד הבא
כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה