# מערך שיעור: Dockerfile📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יכתבו Dockerfile ל-ASP.NET Core API משלהם, כולל Multi-Stage Build.

בסוף השיעור הסטודנטים צריכים: לכתוב Dockerfile בסיסי עם FROM/COPY/RUN, להסביר Multi-Stage Build ולמה הוא מקטין Image, ולנצל נכון את מנגנון ה-Cache.

דגש קריטי: הראו את גודל ה-Image לפני ואחרי Multi-Stage בפועל (`docker images`) — ההבדל המספרי הוא ההוכחה, לא רק הסבר תיאורטי.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | הזכירו: השתמשנו ב-Images מוכנים, איך בונים משלנו? |
| הרעיון: Dockerfile בסיסי | 20 דקות | FROM/COPY/RUN, בנייה עם docker build |
| הדגמה חיה: build+run | 15 דקות | הריצו על פרויקט ASP.NET Core אמיתי |
| הבעיה: Image שמן מדי | 10 דקות | הראו גודל Image עם SDK מלא |
| הרעיון: Multi-Stage Build | 25 דקות | שני שלבים, COPY --from |
| Cache וסדר COPY | 10 דקות | הדגימו build שני מהיר יותר |
| תרגול מודרך | 5 דקות | תרגיל 1 |

---

## דגשים להעברת השיעור

- ההדגמה החיה של גודל Image (`docker images`) לפני ואחרי Multi-Stage היא הרגע החשוב ביותר — מספר קונקרטי (למשל "1.2GB → 220MB") משכנע הרבה יותר מהסבר.
- סדר ה-`COPY` (csproj לפני קוד מלא) הוא נקודה עדינה שקל לפספס — הדגימו build שני עם שינוי קוד קטן, והראו שהוא מהיר יותר בזכות ה-Cache.
- אל תעמיקו מדי בפרטי כל instruction ב-Dockerfile (יש עוד רבים) — התמקדו ב-4 שכבר הוצגו (FROM/COPY/RUN/ENTRYPOINT) ובעיקרון ה-Multi-Stage.

---

## מושגים

**Dockerfile** — הוראות שלב-אחר-שלב לבניית Image.
**`FROM`/`COPY`/`RUN`** — Base Image, העתקת קבצים, הרצת פקודת בנייה.
**Multi-Stage Build** — הפרדת שלב-בנייה משלב-ריצה, Image קטן יותר.

---

## תרגיל חשיבה

**שאלת פתיחה:** "אם תעתיקו את כל קוד הפרויקט (`COPY . .`) לפני `dotnet restore` — מה קורה לזמן ה-Build בכל פעם ששורת קוד אחת משתנה?"

**מהלך:** הובילו לתובנה: Docker בונה כל שכבה (instruction) מחדש אם **משהו** בה או לפניה השתנה. אם `COPY . .` (שכולל את קוד המקור המשתנה תדיר) מגיע **לפני** `restore`, כל שינוי קוד קטן "מפיל" את ה-Cache של `restore` גם כן — מוריד NuGet מחדש כל פעם, גם כשהתלויות לא השתנו כלל.

**מה המרצה מראה בסוף:** בנו את אותו Dockerfile פעמיים ברצף עם שינוי קוד קטן ביניהן — פעם עם `COPY . .` לפני `restore` (Build שני איטי, מוריד הכל מחדש), ופעם עם הסדר הנכון (Build שני מהיר, `restore` מגיע מה-Cache). ההבדל בזמן בפועל הוא הלקח.
