مقدمة
Docker هي أداة حاويات تساعد المطورين على إنشاء وإدارة حاويات محمولة متوافقة مع Linux.
عند تطوير أو نشر حاويات، غالبًا ما تحتاج إلى النظر داخل حاوية قيد التشغيل للتحقق من حالتها الحالية أو استكشاف أي مشكلة وإصلاحها. لهذا الغرض، يوفر Docker أمر docker exec لتنفيذ التطبيقات في حاويات قيد التشغيل.
في هذا البرنامج التعليمي، سنتعلم عن أمر docker exec وكيفية استخدامه لتشغيل الأوامر والحصول على غلاف تفاعلي في حاوية Docker.
المتطلبات الأساسية
يفترض هذا البرنامج التعليمي أنك ثبّت Docker بالفعل وأن المستخدم لديه صلاحية تشغيله. إذا كنت بحاجة إلى تشغيل Docker بصلاحيات الجذر، يُرجى إضافة sudo إلى أوامر هذا البرنامج التعليمي.
إطلاق حاوية اختبار
لاستخدام أمر docker exec، تحتاج إلى حاوية Docker قيد التشغيل. إذا لم تكن لديك واحدة، فابدأ حاوية اختبار باستخدام أمر docker exec التالي:
docker run -d --name container-name alpine watch "date >> /var/log/date.log"يُنشئ هذا الأمر حاوية Docker جديدة من صورة Alpine الرسمية. هذه صورة حاوية Linux شائعة تستخدم Alpine Linux، وهي توزيعة Linux خفيفة الوزن وبسيطة.
نستخدم -d لفصل الحاوية عن الطرفية وتشغيلها في الخلفية. يُسمّي الأمر --name container-name الحاوية. يمكنك اختيار أي اسم تريده هنا أو تركه تمامًا ليُنشئ Docker اسمًا فريدًا للحاوية الجديدة تلقائيًا.
بعد ذلك لدينا alpine الذي يحدد الصورة التي نريد استخدامها للحاوية.
وأخيرًا، لدينا الأمر "date >> /var/log/date.log". هذا هو الأمر الذي نريد تشغيله في الحاوية. افتراضيًا، ستنفذ الساعة الأمر الذي تُدخله كل ثانيتين. الأمر الذي ستنفذه الساعة في هذه الحالة هو date >> /var/log/date.log. يطبع الأمر date التاريخ والوقت الحاليين، كما يلي:
OutputFri Jul 23 14:57:05 UTC 2021يُعيد القسم >> /var/log/date.log توجيه مُخرَج أمر التاريخ ويُضيفه إلى الملف /var/log/date.log. يُضاف سطر جديد إلى الملف كل ثانيتين، وبعد بضع ثوانٍ سيبدو كالتالي:
Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021بعد ذلك، سنتعلم كيفية العثور على أسماء حاويات Docker. هذا مفيد إذا كانت لديك الحاوية التي تستهدفها بالفعل، ولكنك غير متأكد من اسمها.
العثور على اسم حاوية Docker
نحتاج إلى تزويد docker exec باسم (أو مُعرِّف الحاوية) الحاوية التي نريد العمل عليها. يُمكننا العثور على هذه المعلومات باستخدام أمر docker ps:
docker psيسرد هذا الأمر جميع حاويات Docker التي تعمل على الخادم ويوفر بعض المعلومات عالية المستوى عنها:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-nameفي هذا المثال، تم تمييز معرف الحاوية واسمها. يمكنك استخدام أيٍّ منهما لإعلام docker exec بأي حاوية سيستخدم.
إذا كنت تريد تغيير اسم الحاوية الخاصة بك، استخدم أمر docker rename:
docker rename container-name new-nameبعد ذلك، سنقوم بتشغيل العديد من الأمثلة حول استخدام docker exec لتنفيذ الأوامر في حاوية Docker.
تشغيل غلاف تفاعلي في حاوية Docker
إذا كنت بحاجة إلى تشغيل غلاف تفاعلي داخل حاوية Docker، ربما لاستكشاف نظام الملفات أو تصحيح أخطاء العمليات الجارية، فاستخدم docker exec مع العلامتين -i و-t.
يُبقي العلم -i مدخلات الحاوية مفتوحة، ويُنشئ العلم -t طرفية وهمية يُمكن للشل الاتصال بها. يُمكن دمج هذين العلمين كما يلي:
docker exec -it container-name shسيؤدي هذا إلى تشغيل واجهة البرنامج في الحاوية المحددة وسيظهر لك موجه أولي. للخروج من الحاوية، اكتب exit ثم اضغط ENTER.
exitإذا كانت صورة الحاوية الخاصة بك تتضمن غلافًا أكثر تقدمًا مثل bash، فيمكنك استبدال sh بـ bash أعلاه.
تشغيل أمر غير تفاعلي في حاوية Docker
إذا كنت بحاجة إلى تشغيل أمر داخل حاوية قيد التشغيل، ولكنك لا تحتاج إلى التفاعل، فاستخدم أمر docker exec بدون أي علامات:
docker exec container-name tail /var/log/date.logسيُشغّل هذا الأمر الأمر tail /var/log/date.log على اسم الحاوية ويطبع النتائج. افتراضيًا، يطبع أمر tail آخر عشرة أسطر من الملف. إذا شغّلت حاوية الاختبار التي أعددناها في القسم الأول، فسترى ما يلي:
Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021هذا يُشبه إلى حد كبير فتح نافذة تفاعلية لحاوية Docker (كما في الخطوة السابقة باستخدام docker exec -it container-name sh ) ثم تشغيل الأمر tail /var/log/date.log. مع ذلك، بدلاً من فتح نافذة تفاعلية، وتشغيل الأمر، ثم إغلاقها، يُعيد هذا الأمر نفس النتيجة في أمر واحد دون الحاجة إلى فتح نافذة طرفية وهمية.
تشغيل الأوامر في دليل بديل في حاوية Docker
لتشغيل أمر في دليل محدد في الحاوية الخاصة بك، استخدم العلم –workdir لتحديد الدليل:
docker exec --workdir /tmp container-name pwdيقوم أمر المثال هذا بتعيين دليل /tmp كدليل العمل، ثم يقوم بتشغيل أمر pwd، الذي يطبع دليل العمل الحالي:
Output
/tmpأكد الأمر pwd أن دليل العمل هو /tmp.
تشغيل الأوامر كمستخدم مختلف في حاوية Docker
لتشغيل أمر كمستخدم مختلف داخل الحاوية الخاصة بك، أضف العلم --user:
docker exec --user guest container-name whoamiيستخدم هذا المستخدم الضيف لتشغيل أمر whoami في الحاوية. يطبع أمر whoami اسم المستخدم الحالي للمستخدم:
Output
guestيؤكد أمر whoami أن المستخدم الحالي للحاوية هو الضيف.
تمرير متغيرات البيئة إلى حاوية Docker
أحيانًا يكون من الضروري تمرير متغيرات بيئة إلى الحاوية مع أمر التشغيل. يتيح لك الرمز -e تحديد متغير بيئة:
docker exec -e TEST=sammy container-name envيقوم هذا الأمر بتعيين متغير بيئة الاختبار (TEST) إلى sammy، ثم يُشغّل أمر env داخل الحاوية. يقوم الأمر env بعد ذلك بطباعة جميع متغيرات البيئة:
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/rootتم تعيين المتغير TEST إلى sammy.
لتعيين متغيرات متعددة، كرر العلم -e لكل منها:
docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name envإذا كنت تريد تمرير ملف ممتلئ بالمتغيرات البيئية، فيمكنك القيام بذلك باستخدام علامة –env-file.
أولاً، أنشئ الملف باستخدام محرر نصوص. سنفتح ملفًا جديدًا باستخدام nano هنا، ولكن يمكنك استخدام أي محرر نصوص يناسبك:
nano .envنحن نستخدم .env كاسم ملف لأنه معيار شائع لاستخدام هذه الأنواع من الملفات لإدارة المعلومات خارج التحكم في الإصدار.
اكتب متغيرات KEY=value في الملف، متغير واحد لكل سطر، كما هو موضح أدناه:
TEST=sammy
ENVIRONMENT=prodاحفظ الملف وأغلقه. لحفظ الملف والخروج من nano، اضغط CTRL+O، ثم ENTER للحفظ، ثم CTRL+X للخروج.
الآن قم بتشغيل أمر docker exec وحدد اسم الملف الصحيح بعد –env-file:
docker exec --env-file .env container-name envOutput
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/rootتم تعيين متغيرين في الملف.
يمكنك تحديد ملفات متعددة باستخدام علامات –env-file متعددة. إذا تداخلت المتغيرات في الملفات، فسيحل الملف المُدرج في الأمر الأخير محل الملفات السابقة.
الأخطاء الشائعة
عند استخدام أمر docker exec، قد تواجه بعض الأخطاء الشائعة:
Error: No such container: container-name
يعني خطأ "لا توجد حاوية من هذا النوع" أن الحاوية المحددة غير موجودة، وقد يشير إلى خطأ في كتابة اسمها. استخدم docker ps لعرض الحاويات قيد التشغيل، وتحقق من الاسم جيدًا.
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
تعني هذه الرسالة أن الحاوية موجودة ولكنها متوقفة. يمكنك تشغيل الحاوية باستخدام الأمر docker start container-name
Error response from daemon: Container container-name is paused, unpause the container before exec
يوضح خطأ "الحاوية متوقفة مؤقتًا" المشكلة جيدًا. قبل المتابعة، يجب إلغاء الإيقاف المؤقت للحاوية باستخدام الأمر docker unpause container-name.
نتيجة
في هذا البرنامج التعليمي تعلمنا كيفية تنفيذ الأوامر في حاوية Docker قيد التشغيل، إلى جانب بعض خيارات سطر الأوامر عند القيام بذلك.









