Docker Exec - כיצד להפעיל פקודה בתוך תמונה או מיכל של דוקר

אני אכניס לך סוד של DevOps כאן: הדבר שכל מה שאנשי DevOpsy אוהבים לעשות הוא לבנות מערכת סופר מפוארת ומורכבת ואז למצוא דרך להתמודד עם זה כמו מעטפת רגילה. או התחבר אליו באמצעות SSH ואז התייחס אליו כמו פגז רגיל.

דוקר אינו שונה! אתה מפעיל מחשב בתוך מחשב אחר. אולי המחשב הזה הוא מופע EC2 או מחשב נייד. אתה יכול אפילו להשתגע באמת ולהפעיל VM כי הוא פועל אז Docker.

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

סיפור קצר, אתה יכול להגיד לדוקר להפעיל את הפקודה bash, שמפילה אותך לקליפה:

docker run -it name-of-image bash # docker run -it continuumio/miniconda3:latest bash # docker run -it node:latest bash

אבל המשך לקרוא לעוד. ;-)

נסה את זה

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

# From Host echo $(pwd) # Drop into docker shell docker run -it continuumio/miniconda3:latest bash # Now you are in the docker shell! echo $(pwd) echo $USER

מגניב הא? זה מושלם לניפוי באגים במיכל שלגמרי אמור לעבוד כמו שצריך. זה נהדר גם במקרה השימוש הנפוץ ביותר שלי "אני לא רוצה להתקין את זה למחשב שלי".

ניפוי באגים בבניית Docker עם Docker Run

התייחסות לתמונת ה- Docker שלך כמו מעטפת רגילה תועיל כשמנסים לנקות באגים של Docker.

נניח שיש לך קובץ Docker לתמונה שאתה מנסה לבנות. בדרך כלל מה שקורה הוא שכאשר פועל docker build -t my-image .(-t הוא עבור תג) Docker יעבור דרך כל אחד משלבי ה- RUN שלך, ויעצור כאשר הוא מגיע לפקודה שלא תצא כראוי.

במעטפת UNIX, קוד היציאה 0 אומר שהכל בסדר עם פקודה. אז כדי להמחיש נקודה זו, גרמתי ל- Dockerfile שלנו לפקודת RUN שיוצאת עם 1.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes RUN exit 1
docker build -t my-image .

זה יביא לך פלט שנראה כמו:

(base) ➜ my-image docker build -t my-image . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/4 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/4 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Step 4/4 : RUN exit 1 ---> Running in 7c98aab6b52c The command '/bin/sh -c exit 1' returned a non-zero code: 1

אתה יכול לאשר שתמונת ה- Docker שלך לא נבנתה על ידי הפעלה docker imagesובדיקה my-image. זה לא יהיה שם כי הוא לא נבנה בהצלחה.

עכשיו מה שאנחנו יכולים לעשות זה להעיר על הפקודה RUN הטורדנית של Dockerfile.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes #RUN exit 1

אז מה שתראה הוא:

Sending build context to Docker daemon 2.048kB Step 1/3 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/3 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/3 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Successfully built 19478bb3ce67 Successfully tagged my-image:latest 

כעת תוכל להיכנס לתמונת ה- Docker שלך ולהתחיל להפעיל פקודות באופן אינטראקטיבי!

docker run -it my-image bash # you can also run # docker run -it my-image:latest bash

מכאן, אחד אחד, אתה יכול להתחיל באגים בפקודות RUN שלך כדי לראות מה השתבש. אם אינך בטוח אם פקודה יצאה כראוי או לא, הפעל $?:

# First run docker run -it my-image bash to get to the shell # Print the string hello echo "hello" # hello echo $? # 0 # Run a non existant command hello $(hello) # bash: hello: command not found echo $? # 127

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

לעטוף

אני מקווה שהראיתי לך ששימוש בתמונת Docker אינו שונה מהמסוף במחשב שלך. שימוש בתמונות Docker הוא דרך מדהימה להפצת יישומים.

נסו לקחת את יישום ה- CLI המועדף עליכם או את פרויקט GitHub הבא, ובמקום ליצור סקריפט התקנה, ארזו אותו עם Docker. ;-)