استخدام تعليمات Dockerfile ENTRYPOINT و CMD

إذا كنت بحاجة إلى تشغيل أمر أو اثنين في حاوية 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.

mkdir ~/docker
cd docker

3. الآن، قم بإنشاء ملف نصي فارغ يسمى Dockerfile باستخدام الأمر التالي.

cd > Dockerfile

بدلاً من ذلك، يمكنك إنشاء ملف Dockerfile باستخدام الأمر التالي إذا كنت تستخدم نظام التشغيل Linux أو Mac OS.

touch Dockerfile

4. في النهاية، أضف المحتوى التالي إلى Dockerfile

FROM ubuntu:20.04

لقد قمت الآن بإنشاء ملف Dockerfile قريباً جداً!

بناء صورة Docker

الآن بعد أن قمت بإنشاء ملف Dockerfile الخاص بك، يجب عليك بناء صورة Docker لتنفيذ الأوامر المكتوبة في تعليمات Dockerfile ENTRYPOINT وCMD. يمكنك بناء الصورة باستخدام الأمر build.

أثناء وجودك في الدليل ~/docker، قم بتشغيل الأمر التالي. الأمر أدناه ينشئ صورة Docker تسمى demo (-t demo) من ملف Dockerfile في ~/docker بتحديد دليل العمل الحالي (.).

docker build -t demo .
Building a Docker Image

تشغيل حاوية Docker

بعد أن قمت ببناء صورة Docker، ستحتاج إلى حاوية لتشغيل الصورة Docker التي ستنفذ الأوامر من تعليمات Dockerfile ENTRYPOINT وCMD.

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

docker run -it demo
Running a Docker Container

التنفيذ بالصيغة القياسية مقابل الصيغة الشلية

عندما تبدأ في العمل مع ملف Dockerfile وتجد كيفية تشغيل الأوامر التي تبدأ تلقائياً، قد تواجه طريقتين مختلفتين لتحديد هذه الأوامر. كل طريقة تستدعي الأوامر لكن تفعل ذلك بشكل مختلف قليلاً.

عندما ينفذ Docker الأوامر، يمكنه القيام بذلك مباشرة باستدعاء exec أو عن طريق الذهاب من خلال القشرة الخاصة بالحاوية (/bin/sh -c على Linux أو cmd /S /C على Windows) والتي تسمى shell.

ستلاحظ أن الأوامر التي يتم تنفيذها عبر exec تحتوي على تعليمة تتبعها البرامج القابلة للتشغيل تليها واحد أو أكثر من وسيطات السطر، كما هو موضح أدناه.

ENTRYPOINT ["executables", "parameter1", "parameter2", ...]
CMD ["executables", "parameter1", "parameter2:, ...]

كتابة الأوامر بصيغة shell، من ناحية أخرى، لا تتطلب لف الأوامر بين أقواس مربعة، كما هو موضح أدناه.

ENTRYPOINT <command> "parameter1"
CMD <command> "parameter1"

إذا لم تحدد وسيطة لـ 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.

FROM ubuntu:20.04
# تعليمة CMD
CMD ["echo", "Hello world"] # Exec Form
CMD echo "Hello world"      # Shell Form
# تعليمة ENTRYPOINT
ENTRYPOINT ["echo", "Hello world"] # Exec Form
ENTRYPOINT echo "Hello world"      # Shell Form

3. أثناء وجودك في الدليل ~/docker، قم ببناء الصورة الجديدة عبر تشغيل docker build وسمِّها demo. الأمر أدناه يعلم الصورة بأنها demo ويبحث عن ملف Dockerfile في دليل العمل الحالي (.).

docker build -t demo .
Building a Docker image with docker build

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

docker run -it demo
Running a Docker container with docker run

استخدام المتغيرات في ملف Dockerfile

أحيانًا قد لا تعرف الوسائط الخاصة بسطر الأوامر التي يجب تمريرها إلى الأمر مسبقًا. تُكشَف الوسائط التي تحتاج إلى تمريرها إلى الأمر فقط أثناء التشغيل. بدلاً من تعيين وسائط الأمر بشكل استاتيكي، يمكنك التقاط وتمرير تلك الوسائط إلى الأوامر باستخدام المتغيرات.

يمكنك استخدام متغيرات ملف Dockerfile فقط في صيغة الـ shell. لا يدعم Docker المتغيرات في الأمر المستدعى عبر صيغة exec.

افتح ملف Dockerfile في محرر النص المفضل لديك مرة أخرى، واستبدل كل شيء فيه بمجموعة الأوامر التالية واحفظه.

ستلاحظ هذه المرة أن ملف Dockerfile يستخدم متغيرات البيئة ويظهر باستخدام ENV. في المثال أدناه، يقوم ملف Dockerfile بتعريف متغير بيئي يسمى name بقيمة friend. بمجرد إنشاءه، يتم الإشارة إلى هذا المتغير البيئي عبر $name.

عندما يشغل Docker الحاوية بناءً على هذا الملف، سيستدعي أمر echo ويمرر الوسيط “مرحبًا، صديق”.

FROM ubuntu:20.04
ENV name friend

CMD echo "Welcome, $name"
# أو
## ENTRYPOINT echo "مرحبًا، $name"

الآن، قم بإنشاء صورة Docker وتشغيل الحاوية مرة أخرى مع توفير اسم وسم اختياري shellform. ستلاحظ أن Docker استدعى أمر echo وأرجع الناتج المتوقع.

Building a Docker Image (shellform) and Running a Docker Container

دمج تعليمات Dockerfile ENTRYPOINT و CMD

كثيرًا ما ستقوم باستدعاء أوامر بدء التشغيل enteither في CMD أو التعليمة ENTRYPOINT. في النهاية، يمكنك استدعاء العديد من الأوامر باستخدام كل طريقة. ولكن يمكنك أيضًا استدعاء أمر واحد و “بناؤه” باستخدام كلتا التعليمتين.

بناءً على الأمثلة السابقة، ربما يكون لديك ملف Dockerfile يبدو مثل المثال أدناه. كما هو، إذا قمت بإنشاء صورة وتشغيل حاوية من تلك الصورة، سيقوم Docker باستدعاء أمر echo ويعيد Hello.

FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]

ربما يكون لديك Argument آخر ترغب في تمريره إلى أمر echo ولكن ليس على الفور. ربما ترغب في القيام بذلك في وقت لاحق في Dockerfile. من خلال استدعاء تعليمة CMD بدون أمر، يمكنك القيام بذلك.

عند تحديد أمر تشغيل من خلال تعليمة ENTRYPOINT تتبعها تعليمة CMD، يفترض Docker تلقائيًا أن القيمة الممررة إلى CMD هي argument؛ وليس أمرًا.

الآن، أضف تعليمة CMD بدون أمر، ولكن بدلاً من ذلك بمعرف الArgument يسمى world، كما هو موضح أدناه.

FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
CMD ["world"]

يجب دائمًا كتابة تعليمات الجمع بشكل exec form بسبب سلوكها “شبيه بالمصفوفة” في تحديد القيم بشكل فردي مفصولة بفواصل مقابل كلها في سلسلة واحدة.

بعد بناء الصورة وتشغيل الحاوية من الصورة، يمكنك رؤية أن Docker يعيد فقط سطر واحد بدلاً من سطرين من الإخراج (Hello و world)، مما يعني استدعاء أمر echo واحد فقط.

Building a Docker Image (demo3) and Running a Docker Container

الختام

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

هل يمكنك التفكير في سيناريو حيث تفضل استخدام CMD على ENTRYPOINT لتشغيل أمر بدء التشغيل؟

Source:
https://adamtheautomator.com/dockerfile-entrypoint/