• בלוג
  • איך ליצור Docker Image בלי Dockerfile

איך ליצור Docker Image בלי Dockerfile

29/04/2021

הדרך המקובלת ליצור אימג' לדוקר היא לכתוב Dockerfile, שזה קובץ עם הוראות לדוקר איך בדיוק לבנות את האימג'. שימוש ב Dockerfile עוזר לשמור על סדר:

  1. דוקרפייל הוא קובץ בפורמט טקסט, כך שאפשר להתייחס אליו בתור קוד מקור לכל דבר.

  2. אפשר לשמור את ה Dockerfile בגיט ולנהל עליו גירסאות.

  3. אפשר לשתף את ה Dockerfile עם חברים כדי שיוכלו בעצמם לבנות את האימג' לפי אותן הוראות.

  4. קל מאוד לתחזק אימג'ים ולשנות אותם כשיש לך ביד את ה Dockerfile שבונה את האימג'.

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

אם כל מה שאני צריך זה לבנות אימג' חד-פעמי, למשל בשביל תרגיל לקורס או בשביל לשתף הדגמה עם חבר, אני יכול ליצור אימג' ישירות מתוך קונטיינר קיים בלי Dockerfile ובלי לזכור מה עשיתי כדי להגיע למצב המסוים של הקונטיינר.

זה עובד ככה:

  1. יוצרים קונטיינר חדש ומריצים אותו, למשל עבור אלפין לינוקס אפשר להפעיל:
$ docker run -d --rm alpine sleep infinity
  1. נכנסים לקונטיינר ומתחילים ליצור שם קבצים או לשנות דברים במכונה (שימו לב לשנות את ה Container ID לערך שמופיע אצלכם):
$ docker exect -it 2b090ffbd1fb /bin/sh
  1. בשביל המשחק אני מפעיל בתוך המכונה את הפקודה הבאה כדי ליצור משתמש חדש:
/ # adduser ynon

אחרי שבחרתי סיסמה אני יוצא מהקונטיינר ובמכונה הראשית שלי מפעיל (שוב שימו לב להחליף את ה Container ID למה שמופיע אצלכם):

$ docker commit 2b090ffbd1fb
  1. הקומיט יצר אימג' חדש, וכשנסתכל ב docker images נוכל לראות אותו עדיין ללא שם:
<none>               <none>          3030ab2039c3   30 seconds ago   5.58MB
  1. נשאר רק לתת שם לאימג' כדי שאפשר יהיה לדחוף אותו ל docker hub (ושוב שימו לב לשנות את ה Image ID לזה שהופיע אצלכם, ואת שם האימג' למשהו שמתאים למשתמש דוקרהאב שלכם):
$ docker image tag 3030ab2039c3 ynonp/commit-demo
  1. ובסוף אפשר לדחוף את האימג' החדש לדוקרהאב כדי שכולכם תוכלו להשתמש בו:
$ docker push ynonp/commit-demo
  1. אלה מכם שירצו לשחק עם האימג' החדש שיצרתי צריכים עכשיו רק להריץ:
$ docker run -it --rm ynonp/commit-demo /bin/sh

בשיטה הזאת הרבה יותר קשה לזכור מה עשינו בתוך הקונטיינר ואיך בדיוק יצרנו את האימג', ולכן לא הייתי משתמש בה לפרויקט אמיתי, אבל לדוגמאות או תרגולים בקורסים או שיתוף קוד עם חברים היא יכולה לעבוד ממש בקלות.