إذا كنت بحاجة إلى تشغيل أمر أو اثنين في حاوية Docker الخاصة بك عند بدء التشغيل، فهذا البرنامج التعليمي موجه لك. باستخدام تعليمات ENTRYPOINT
و CMD
في Dockerfile ، يمكنك تشغيل الأوامر التي ترغب في تنفيذها عند بدء التشغيل.
في هذا البرنامج التعليمي، ستتعلم كيفية استخدام تعليمات ENTRYPOINT
و CMD
لتشغيل الأوامر عند بدء التشغيل في ملف Dockerfile وفهم الاختلافات بينهما.
المتطلبات الأولية
نظرًا لأن هذا البرنامج التعليمي سيكون عرضًا تفاعليًا، تأكد من توفر ما يلي:
- A Windows 10 PC – Windows 10 v10.0.19042 was used in this tutorial.
- سطح المكتب Docker – يستخدم هذا البرنامج التعليمي سطح المكتب Docker الإصدار 3.3.1.
إنشاء ملف Dockerfile
قبل أن تتمكن من تشغيل أوامر بدء تشغيل حاوية Docker، يجب أن تنشئ أولاً ملف Dockerfile. ملف Dockerfile هو وثيقة نصية تحتوي على قائمة من الأوامر لبناء الحاويات، وصور Docker وتحديد كيفية إنشاء صورة Docker.
1. أولاً، قم بفتح PowerShell كمسؤول.
2. قم بإنشاء مجلد جديد لتخزين ملف Dockerfile وجميع الملفات المرتبطة التي ستستخدمها هذه الدورة التعليمية وقم بالتغيير إلى تلك الدليل. تستخدم هذه الدورة التعليمية ~/docker.
3. الآن، قم بإنشاء ملف نصي فارغ يسمى Dockerfile باستخدام الأمر التالي.
بدلاً من ذلك، يمكنك إنشاء ملف Dockerfile باستخدام الأمر التالي إذا كنت تستخدم نظام التشغيل Linux أو Mac OS.
4. في النهاية، أضف المحتوى التالي إلى Dockerfile
لقد قمت الآن بإنشاء ملف Dockerfile قريباً جداً!
بناء صورة Docker
الآن بعد أن قمت بإنشاء ملف Dockerfile الخاص بك، يجب عليك بناء صورة Docker لتنفيذ الأوامر المكتوبة في تعليمات Dockerfile ENTRYPOINT وCMD. يمكنك بناء الصورة باستخدام الأمر build
.
أثناء وجودك في الدليل ~/docker، قم بتشغيل الأمر التالي. الأمر أدناه ينشئ صورة Docker تسمى demo (-t demo
) من ملف Dockerfile في ~/docker بتحديد دليل العمل الحالي (.
).

تشغيل حاوية Docker
بعد أن قمت ببناء صورة Docker، ستحتاج إلى حاوية لتشغيل الصورة Docker التي ستنفذ الأوامر من تعليمات Dockerfile ENTRYPOINT وCMD.
لتشغيل حاوية Docker، قم بإستدعاء الأمر run
لإنشاء طبقة حاوية قابلة للكتابة فوق صورة Docker (demo
). المثال أدناه يستخدم المعلمة -it
للاتصال تفاعلياً بالحاوية حتى تتمكن من رؤية الناتج العيني.

التنفيذ بالصيغة القياسية مقابل الصيغة الشلية
عندما تبدأ في العمل مع ملف Dockerfile وتجد كيفية تشغيل الأوامر التي تبدأ تلقائياً، قد تواجه طريقتين مختلفتين لتحديد هذه الأوامر. كل طريقة تستدعي الأوامر لكن تفعل ذلك بشكل مختلف قليلاً.
عندما ينفذ Docker الأوامر، يمكنه القيام بذلك مباشرة باستدعاء exec
أو عن طريق الذهاب من خلال القشرة الخاصة بالحاوية (/bin/sh -c
على Linux أو cmd /S /C
على Windows) والتي تسمى shell
.
ستلاحظ أن الأوامر التي يتم تنفيذها عبر exec
تحتوي على تعليمة تتبعها البرامج القابلة للتشغيل تليها واحد أو أكثر من وسيطات السطر، كما هو موضح أدناه.
كتابة الأوامر بصيغة shell
، من ناحية أخرى، لا تتطلب لف الأوامر بين أقواس مربعة، كما هو موضح أدناه.
إذا لم تحدد وسيطة لـ
CMD
، فسيقوم Docker دائمًا بتنفيذ الأمر بصيغة exec على سبيل المثالCMD <command>
.
إذا كنت تبدأ فقط، فإن التمييز بين هاتين الطريقتين لا يهم كثيراً ولكن كلما تقدمت أكثر، سترى قريباً فوائد وعيوب كل منهما.
تشغيل أوامر بدء التشغيل
لنقم الآن بالدخول في جوهر هذا البرنامج التعليمي ونبدأ بالعمل عن كثب من خلال استعراض بعض الأمثلة على تشغيل أوامر البدء في الـ Dockerfile باستخدام التعليمات ENTRYPOINT
و CMD.
1. افتح ملف Dockerfile الذي أنشأته سابقًا في محرر النص الذي تفضله.
2. انسخ والصق محتويات ملف Dockerfile المثال في ملف Dockerfile الخاص بك، كما هو موضح أدناه، ثم احفظ التغييرات.
ينشئ هذا الملف القائمة باستخدام ubuntu:20.04
كصورة أساسية. ثم يُخبر Docker بتنفيذ أمر echo
ممررًا إليه الوسيطة Hello world
لكل من تعليمات Dockerfile CMD
و ENTRYPOINT
باستخدام الشكلين exec
و shell
.
3. أثناء وجودك في الدليل ~/docker، قم ببناء الصورة الجديدة عبر تشغيل docker build
وسمِّها demo
. الأمر أدناه يعلم الصورة بأنها demo
ويبحث عن ملف Dockerfile في دليل العمل الحالي (.
).

4. الآن، قم بتشغيل حاوية باستخدام الصورة ثم قم بتشغيل حاوية Docker بناءً على الصورة التي تم إنشاؤها سابقًا. سترى الآن أن الحاوية تعيد Hello world
الذي جاء من التعليمة CMD
الموجودة في ملف Dockerfile.

استخدام المتغيرات في ملف Dockerfile
أحيانًا قد لا تعرف الوسائط الخاصة بسطر الأوامر التي يجب تمريرها إلى الأمر مسبقًا. تُكشَف الوسائط التي تحتاج إلى تمريرها إلى الأمر فقط أثناء التشغيل. بدلاً من تعيين وسائط الأمر بشكل استاتيكي، يمكنك التقاط وتمرير تلك الوسائط إلى الأوامر باستخدام المتغيرات.
يمكنك استخدام متغيرات ملف Dockerfile فقط في صيغة الـ
shell
. لا يدعم Docker المتغيرات في الأمر المستدعى عبر صيغةexec
.
افتح ملف Dockerfile في محرر النص المفضل لديك مرة أخرى، واستبدل كل شيء فيه بمجموعة الأوامر التالية واحفظه.
ستلاحظ هذه المرة أن ملف Dockerfile يستخدم متغيرات البيئة ويظهر باستخدام ENV
. في المثال أدناه، يقوم ملف Dockerfile بتعريف متغير بيئي يسمى name
بقيمة friend
. بمجرد إنشاءه، يتم الإشارة إلى هذا المتغير البيئي عبر $name
.
عندما يشغل Docker الحاوية بناءً على هذا الملف، سيستدعي أمر echo
ويمرر الوسيط “مرحبًا، صديق”.
الآن، قم بإنشاء صورة Docker وتشغيل الحاوية مرة أخرى مع توفير اسم وسم اختياري shellform
. ستلاحظ أن Docker استدعى أمر echo
وأرجع الناتج المتوقع.

دمج تعليمات Dockerfile ENTRYPOINT و CMD
كثيرًا ما ستقوم باستدعاء أوامر بدء التشغيل enteither في CMD أو التعليمة ENTRYPOINT. في النهاية، يمكنك استدعاء العديد من الأوامر باستخدام كل طريقة. ولكن يمكنك أيضًا استدعاء أمر واحد و “بناؤه” باستخدام كلتا التعليمتين.
بناءً على الأمثلة السابقة، ربما يكون لديك ملف Dockerfile يبدو مثل المثال أدناه. كما هو، إذا قمت بإنشاء صورة وتشغيل حاوية من تلك الصورة، سيقوم Docker باستدعاء أمر echo
ويعيد Hello
.
ربما يكون لديك Argument آخر ترغب في تمريره إلى أمر echo
ولكن ليس على الفور. ربما ترغب في القيام بذلك في وقت لاحق في Dockerfile. من خلال استدعاء تعليمة CMD
بدون أمر، يمكنك القيام بذلك.
عند تحديد أمر تشغيل من خلال تعليمة
ENTRYPOINT
تتبعها تعليمةCMD
، يفترض Docker تلقائيًا أن القيمة الممررة إلىCMD
هي argument؛ وليس أمرًا.
الآن، أضف تعليمة CMD
بدون أمر، ولكن بدلاً من ذلك بمعرف الArgument يسمى world
، كما هو موضح أدناه.
يجب دائمًا كتابة تعليمات الجمع بشكل exec form بسبب سلوكها “شبيه بالمصفوفة” في تحديد القيم بشكل فردي مفصولة بفواصل مقابل كلها في سلسلة واحدة.
بعد بناء الصورة وتشغيل الحاوية من الصورة، يمكنك رؤية أن Docker يعيد فقط سطر واحد بدلاً من سطرين من الإخراج (Hello
و world
)، مما يعني استدعاء أمر echo
واحد فقط.

الختام
يجب أن يكون لديك الآن فهم جيد لتشغيل أوامر بدء تشغيل حاوية Docker عبر تعليمات ملف Dockerfile CMD
و ENTRYPOINT
. كل تعليمة مختلفة قليلاً ولكنها تنجز نفس المهمة ويمكن استخدامها حتى معًا.
هل يمكنك التفكير في سيناريو حيث تفضل استخدام CMD
على ENTRYPOINT
لتشغيل أمر بدء التشغيل؟