כיצד להעתיק קבצים עם Docker cp לתוך הקונטיינר שלך ב-Docker

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

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

בוא נתחיל!

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

אם ברצונך ללכת איתי בצעד-אחר-צעד, וודא שיש לך:

  • Docker מותקן על מארח ה-Linux. במדריך זה, אנו משתמשים ב-Docker v19.03.11. תוכל לאמת את גרסת Docker שלך על ידי הרצת הפקודה docker version.
  • יש לך תמונת Docker שהורדה וזמינה. מדריך זה משתמש בתמונת NGINX האחרונה של Docker, הזמינה ב־Docker Hub

העתקת קבצים עם הפקודה docker cp

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

Let's learn how to use the Docker cp command with an example.

1. פתח/י טרמינל במחשב המקומי שלך.

2. צור/י קובץ בשם myfile.txt באמצעות הפקודה touch. הקובץ myfile.txt יועתק ממאכסן ה-Docker לתוך ה-container.

touch myfile.txt

3. בצע/י את הפקודה docker run. הפקודה למטה docker run תיצור תוך כדי קונטיינר חדש ברקע. הפקודה למטה מכילה שלושה פרמטרים המתוארים למטה:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx יהיה הדמות שתשמש להפעלת הקונטיינר.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. בדוק/י אם הקונטיינר של Docker נוצר בהצלחה באמצעות הפקודה docker ps. לאחר ביצוע הפקודה docker ps, את/ה צפה/י בערך חדש שנוצר תחת התכונה CONTAINER ID (במקרה למטה ccae4670f030) באמצעות דמות ה-NGINX המאשרת שהקונטיינר נוצר בהצלחה.

sudo docker ps
Verifying the docker container by running the docker ps command

לפני ביצוע פקודת ה-Docker cp, תחת התחביר של פקודת ה-Docker cp יש:

  • CONTAINER: SRC_PATH מציין את נתיב המקור של הקונטיינר.
  • DEST_PATH הוא נתיב היעד במאכסן.
  • CONTAINER: DEST_PATH הוא נתיב היעד בקונטיינר.

בנוסף, תוכל/י גם להוסיף את הקובע options עם הפרמטרים למטה בפקודה כך:

  • שימוש בארכיון או a – מעתיק את כל ההרשאות של המשתמש והקבוצה הראשית של הקבצים והתיקיות.
  • שימוש ב-L – הגדרת האפשרות L תאפשר לכל קישור סמלי בנתיב המקור להיות מועתק לנתיב היעד.
# תחביר להעתקה מתוך תכולת המיכל למארח Docker  
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# תחביר להעתקה ממארח Docker למיכל  
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. לאחר מכן, בצע את הפקודה docker cp. פקודת docker cp תעתיק את הקובץ myfile.txt שיצרת קודם לכן לתיקיית /usr/share של המיכל. ccae4670f030 הוא מזהה המיכל שאליו יועתק הקובץ myfile.txt.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. לבסוף, התחבר ב-SSH אל המיכל הרץ על ידי הרצת הפקודה docker exec עם /bin/bash, שמשמש כמסך ברירת המחדל להתחברות משתמש של מערכת Linux.

  • הדגל i מציין שתרצה לפתוח מושב SSH אינטראקטיבי למיכל. הדגל i אינו סוגר את המושב SSH אף אם המיכל אינו מחובר.
  • הדגל t מקצץ TTY פיסאודו שיש להשתמש בו כדי להפעיל פקודות באופן אינטראקטיבי. sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

תראה שכעת מחובר למסד הנתונים של המיכל כאשר תריץ את docker exec.

SSH into the running container using docker exec command

7. לאחר התחברות לתוך ה-container, וודא ש-myfile.txt הועתק ל-container באמצעות פקודת ls.

  • ls היא פקודה לרשימת קבצים במחשב במערכות Unix ודומות לה.
  • grep יחפש את כל הקבצים או התיקיות שמתחילים עם המחרוזת my בתיקיית usr/share.
Verifying the files in the container

העתקת קבצים באמצעות DockerFile

בקטע הקודם, למדת כיצד להעתיק קבצים ל-container על ידי הפעלת פקודת Docker cp. מה לעשות אם יש צורך להעתיק קבצים מרובים בפעם אחת? בהחלט, הפעלת פקודות מרובות הופכת למשאב! כדי לפתור את הבעיה של הרצת פקודות מרובות cp, למה לא לנסות להעתיק קבצים או תיקיות ל-container באמצעות Dockerfile עם פקודות COPY?

התקנת תיקייה והעתקת קבצים/תיקיות באמצעות Dockerfile מאפשרת לך להסיר את צעדי ההעתקה הידנית שביצעת בקטע הקודם. Dockerfile הוא מסמך טקסט המכיל את כל הפקודות שמשתמש יכול לקרוא בשורת הפקודה כדי להרכיב דמות.

בואו ליצור Dockerfile, להפעיל קונטיינר ממנו ולהעתיק את הקבצים בסופו.

1. צור תיקייה בשם ~/host-to-container-copy-demo, ושנה (cd) את תיקיית העבודה אליה. תיקייה זו תכיל את כל הקבצים שתיצור בדגמה זו.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. כעת, צור שני קבצי טקסט בשמות myfile1.txt ו-myfile2.txt, העתק והדבק אותם לתוך הקבצים, ושמור אותם בתיקייה ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. צור קובץ נוסף, העתק/הדבק את התצורה הבאה, ושמור את הקובץ בשם Dockerfile בתוך התיקייה ~/host-to-container-copy-demo. כאשר התהליך הושלם, דוקר ישתמש בקובץ זה Dockerfile כדי להריץ את כל הפקודות הדרושות לבניית תמונת Docker חדשה מעל כל תמונת בסיס.

הDockerfile הבא מכיל שלבי/הוראות שונות שיבנו את התכולה החדשה:

  • FROM ההוראה FROM מאתחלת שלב בנייה חדש ומגדירה את התמונת בסיס להוראות הבאות.
  • COPY הפקודה COPY מעתיקה קובץ ממכונת המארח (מארח Docker) לתוך המיכל.
# הוראה לקובץ ה-Dockerfile ליצירת תמונה חדשה מעל התמונת בסיס (אובונטו)
# בשימוש בתמונת בסיס ubuntu: latest
FROM ubuntu:latest
# העתקת myfile1.txt לתיקיית /usr/share במיכל
COPY myfile1.txt /usr/share
# העתקת myfile2.txt לתיקיית /tmp במיכל
COPY myfile2.txt /tmp

4. אמת את כל הקבצים הנדרשים לבניית התמונה החדשה על ידי הרצת פקודת tree. אתה צריך לראות Dockerfile, myfile1.txt, ו-myfile2.txt תחת התיקייה ~/host-to-container-copy-demo.

Verifies files and folders using tree command

5. הבנה, כעת, את התמונה על ידי הרצת פקודת docker build. הדגל t משמש להעניק תג לתמונה updated_ubuntu_image עם התג latest ו. מאפשר ל־docker לבחור את כל הקבצים הנדרשים מהתיקייה הנוכחית לעבודה.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. עכשיו, אמת את התמונה שנבנתה עם הפקודה docker images. שים לב למאפיין REPOSITORY. מאפיין זה הוא התג שנוצר עם הדגל -t בשלב הקודם.

sudo docker images
Repository Attribute

7. לבסוף, הרץ את התוכנית המכונה באמצעות התמונה שנבנתה עם הפקודה docker run. הדגל -it מציין ל־Docker להקצות טרמינל פסאודו-אינטראקטיבי מחובר ל־stdin של התוכנית. bash מספק את הקושי הדיפולטי להתחברות משתמש של מערכת ה־Linux.

sudo docker run -it updated_ubuntu_image bash

תראה למטה שאתה כעת בשלילת Bash של התוכנית ב־Docker.

Running the container using docker run command.

8. הבנה, אם הקבצים הועתקו בהצלחה לתוך התוכנית בתיקיות /tmp ו־/usr/share על ידי הרצת פקודת ls.

Verifying the files if they are successfully copied on the container

עריכת נפח אחסון וגישה לקבצים עם הפקודה Docker Volume

עד כה, למדת כיצד להעתיק קבצים מהמארח לתוך הקונטיינר באמצעות שני גישות שונות באמצעות שימוש בפקודת docker cp וב-DockerFile. הפעם, בואו נלמד כיצד לשתף בקלות מערכות קבצים בין המארח והקונטיינרים באמצעות הפקודה docker volume.

בהנחה שאתה עדיין מחובר לטרמינל:

1. צור נפח על מארח ה-Docker על ידי הרצת הפקודה docker volume create. הפקודה הבאה תיצור נפח בשם my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. אמת כי הנפח נוצר בהצלחה על ידי הרצת הפקודה docker volume ls. הפקודה docker volume ls מפרטת את הנפח. לאחר הרצת הפקודה docker volume ls, תראה my-vol במאפיין VOLUME NAME שמאשר כי הנפח נוצר בהצלחה.

sudo docker volume ls
Listing the docker volumes

3. לאחר מכן, הרץ את הקונטיינר באמצעות הפקודה docker run.

  • הקונטיינר בשם volume_testing משתמש בתמונת nginx: latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. בדוק אם הנפח my-vol שיצרת בעבר ממונם כהלכה עם התוכן באמצעות הפקודה docker inspect. הפקודה Docker inspect מספקת את מידע התוכן. לאחר הרצת הפקודה docker inspect, היא תציג את כל הפרטים של התוכן המסוים (volume_testing), כולל פרטי ההרכבה, כפי שמוצג למטה.

sudo docker inspect volume_testing

למטה, הצילום מסך מאשר כי הנפח (my-vol) שיצרת על המארח מונף בהצלחה עם ספריית ה-container של הקונטיינר באמצעות /app.

Verifying the volumes in the container

מסקנה

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

איזו גישה תבחר להשתמש בה בעת העתקת נתונים מהמארח אל קונטיינרי Docker?

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