Docker Exec: הפקודה שלך להרצת פקודות ב-Docker


האם אי פעם נדרשת לך לראות מה קורה בתוך תוך Docker? הקונטיינרים מיועדים להיות idempotent: אם יש בעיה, יש להשקיע מחדש קונטיינר חדש. לעתים קרובות החיים אינם כל כך פשוטים. עליך להריץ פקודות בקונטיינר כדי לזהות את הבעיה. זהו המקום שבו הפקודה docker exec יכולה לעזור.

מאמר זה ילמד אותך איך להריץ פקודות על קונטיינר Docker פועל באמצעות הפקודה docker exec.

דרישות מוקדמות

על מנת לעקוב אחר הדוגמאות במאמר זה, יש לך צורך להקפיד על הדרישות הבאות.

  • כל גרסה אחרונה של Docker Desktop תפעל על Windows, Linux או macOS. מדריך זה משתמש ב-v3.1.0 הרצה על Windows 10.

התחלת קונטיינר NGINX

פקודת Docker exec מריצה פקודות בקונטיינרים. אך, על מנת לעשות זאת, עליך להיות קיים קונטיינר לרוץ את הפקודות בו. בואו נתחיל בהורדת תמונת Docker ויצירת קונטיינר דמו.

  1. צור תיקייה חדשה, מדריך זה משתמש ב- C:\gitrepos\test, להכיל את הקבצים המשמשים לקונטיינר.

2. צור קובץ, שםו dockerfile (ללא סיומת), המכיל את הקוד הבא. ה-Dockerfile מגדיר את השלבים הנדרשים ליצירת מיכל.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. לאחר מכן, צור קובץ, באותו ספרייה, בשם index.html שמכיל את הקוד הבא. זהו קובץ HTML שבעת התחלת המיכל, יציג הודעת Hello World.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. עכשיו צור מיכל Docker של Nginx. מכיוון שה-Dockerfile נמצא בתיקייה הנוכחית, ציין . כדי לעדכן את מנוע ה-Docker לחפש שם. וודא גם לתייג את המיכל עם my-ngnix באמצעות הפרמטר t כדי להבטיח הפניה קלה יותר בעתיד.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. כעת שהמיכל נבנה, התחל את המיכל עם פקודת Docker run.

# rm - מודיע ל-Docker למחוק את המיכל לאחר שהוא נעצר 
# d - מחזיר שליטה על השורת פקודה לאחר שהפקודה הושלמה 
# p - מטרת ההקצאה של פורט 80 הפנימי של המיכל לפורט 80 חיצוני docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. לבסוף, פתח את דפדפן האינטרנט שלך ונווט אל http://localhost/ כדי לראות את הבא.

Output of the running NGINX container.

הרצת פקודות עם Docker Exec

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

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

איתור שם הקונטיינר וה־ID

עכשיו שיש לך את הקונטיינר שנבנה, תוכל להריץ פקודות בתוך הקונטיינר. לפני שמריצים פקודה, יש לאתר את שם הקונטיינר או ה־ID. גם השם גם ה־ID יעבדו בפקודות של Docker. עם זאת, זכירת ה־ID עשויה להיות קשה יותר מאשר השם!

כדי להציג מידע על קונטיינרים בריצה, יש להריץ את הפקודה Docker ps כדי להדפיס את המידע הבא.

docker ps
Displaying running Docker containers.

יש להעתיק את ה־ID הייחודי, e17e4b6be01a, או את השם שנוצר באופן אקראי mystifying_chandrasekhar ללוח הגזירים שלך לשימוש מאוחר יותר.

הרצת פקודה לא אינטראקטיבית עם Docker Exec

כדי להדגים את הרצת פקודה לא אינטראקטיבית, יש להעתיק ולהריץ את הפקודה הבאה כדי להחזיר רשימת קבצים בתיקיית /var/log עם הפקודה ls -l. יש להעביר את הכל לאחר שם הקונטיינר, mystifying_chandrasekhar, לפקודה exec של Docker.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

מניעת פלט מהמסוף עם פקודות Docker

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

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

ביצוע פקודות אינטרקטיביות עם Docker Exec

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

הרצת פקודות באופן אינטרקטיבי עם docker exec מחייבת שני אפשרויות, i ו־t. האפשרות i משמרת את STDIN פתוח, מאפשרת שליחת פקודות לתוך התקן, והאפשרות t מקצטה נתיב טקסט מוזמן, ערוץ תקשורת, להקלדת פקודות.

העתק והדבק את הפקודה הבאה כדי לפתוח שורת פקודה אינטרקטיבית להתקן Docker הפועל עם המפה (sh) shell, כפי שמצויין בשינוי התרשים ל־/ #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

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

ls -l /var/log
exit
Open an interactive command prompt to the container.

כדי לפתוח פניה אינטראקטיבית בספרייה מסוימת, עבר את הנתיב לאפשרות ה־w וספר ל־Docker להתחיל את המסלול בספרייה מסוימת.

עבר משתני סביבה לתוך התוכנה הרצה

הרבה תוכניות משתמשות במשתני סביבה כדי להגדיר הגדרות בעת התחלת הריצה. לדוגמה, רוב היישומים ב־Java דורשים מהמשתמש להגדיר את המשתנה הסביבתי JAVA_HOME כדי לקבוע את נתיב ה־Java.

אפשר להעביר משתני סביבה למהלך הרצה באמצעות האפשרות e. לדוגמה, אולי תרצה למלא משתנה סביבתי בשם MYVAR לתוך תוכנית משתנה פועלת. כדי לעשות זאת, השתמש באפשרות e וספק את זוג המפתח/ערך של MYVAR="<ערך מסוים>" כפי שמוצג למטה.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

עברת משתני סביבה עם קובץ

אם יש לך הרבה משתני סביבה או הגדרה משותפת, שמירת המשתנים האלה בקובץ עשוי להיות קלה יותר. עבור את הקובץ באמצעות נתיב יחסי או מוחלט ל־Docker עם האפשרות --env-file. טכניקה זו נהוגה לספק פרטי הזדהות מאובטחים לתוך תוכנית משתנה. וודא שלעולם לא להכליל פרטי הזדהות בשליטת גרסאות!

צור קובץ טקסט בשם env-vars.txt עם המשתנים הסביבתיים להעברה וערכיהם. ניתן לקרוא לקובץ כל שמך רוצה והוא אינו דורש את סיומת הקובץ .txt.

Text file with environmental variables defined.

עבור את משתני הסביבה ל־Docker עם האפשרות env-file. וודא שהמשתנים זמינים בעזרת הפקודה echo כפי שמוצג בתמונה מטה.

# עברו את קובץ env-vars.txt ופתחו פקודה אינטרקטיבית
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# אמתו שהמשתנים הסביבתיים זמינים בתוך הקונטיינר של Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

התמודדות עם קונטיינר פועל כמשתמש שונה

בייצור, אפליקציות פועלות בדרך כלל כמשתמש מסוים כדי להגביל את גישתן. אם אתה מפעיל אפליקציות כמשתמש מסוים בייצור, עליך גם לעשות כן בעת בדיקת פקודות.

בדוגמה זו, הקונטיינר של Docker מופעל כמשתמש nginx. עברו את המשתמש לאפשרות ה־w כדי לספר ל־Docker להתחיל את הקונטיינר כמשתמש nginx. הפקודה whoami, הרצה מתוך הקונטיינר, מאשר כי המשתמש nginx באמת משמש.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

שלבים הבאים

למדת כיצד לבצע פקודות בתוך קונטיינר פועל באמצעות פקודת docker exec. באמצעות הפקודה exec להיכנס ולחקור קונטיינרים פועלים, יש לך כלי חזק בתיק הכלים שלך כדי לאתר תקלות בקונטיינרים של Docker.

כעת נסו לקחת את מה שלמדתם צעד קדימה ולהשתמש בשליטת גרסאות של Git כדי למשוך אתר אינטרנט סטטי לקונטיינר, במקום להעתיק קובץ יחיד. אם Git הוא מושג חדש עבורך, אז המאמר מדריך מתחילים ל־Visual Studio Code ו־Git הוא מקום נהדר להתחיל.

Source:
https://adamtheautomator.com/docker-exec/