كيفية كتابة Dockerfile للمبتدئين

كيفية كتابة Dockerfile للمبتدئين

قبل أن نتعمق في ماهية Dockerfile، دعونا نجري تجربة صغيرة. هل تذكر صورة Python التي سحبناها في القسم السابق؟ لنبدأ بدخول الحاوية باستخدام الأمر docker run -it. تذكر ما يفعله المُعامل -it — فهو يُعيّن محطة طرفية زائفة (pseudo-TTY) للحاوية، مما يسمح للمستخدم بالتفاعل معها. بمجرد دخول الحاوية، دعنا نعرض جميع الملفات في الدليل الحالي:

[root@novita ~]# docker run -it python:3.7 /bin/bash
root@692f87774bf7:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@692f87774bf7:/# 

بعد ذلك، سننشئ ملفًا باسم hello.py ثم نعرض جميع الملفات مرة أخرى:

root@692f87774bf7:/# touch hello.py
root@692f87774bf7:/# ls
bin  boot  dev  etc  hello.py  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

يمكنك رؤية أن hello.py قد تم إنشاؤه. الآن، دعنا نخرج من الحاوية ونعيد الدخول إلى الوضع التفاعلي للحاوية باستخدام نفس الأمر docker run -it python:3.7 /bin/bash، ثم نعرض جميع الملفات:

root@692f87774bf7:/# exit
exit
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@65c767655e8a:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@65c767655e8a:/#

ربما لاحظت المشكلة الآن. من المثير للفضول أن الملف الذي أنشأناه سابقًا قد اختفى.

يرجع ذلك إلى أن الإجراءات التي تتم داخل الحاوية لا تُعدّل الصورة (image). الحاوية ببساطة تُضيف طبقة قابلة للكتابة فوق الصورة، تمامًا مثل ورقة التتبع فوق قالب الخط — بغض النظر عما تكتبه على ورقة التتبع، فإنه لا يؤثر على الطبقة الموجودة تحتها. هذه الميزة تشبه إلى حد ما لقطة حالة (snapshot) للآلة الافتراضية.

ولكن ها هي المشكلة: إذا كانت الإجراءات داخل الحاوية لا تُعدّل الصورة، فكيف يمكننا تحقيق النشر السريع دون تكرار عمليات معينة قبل كل نشر للكود؟ سيكون ذلك غير فعال.

لنفترض أنك قائد تقني لمنصة وسائط اجتماعية، وفجأة حدث حدث فيروسي يتطلب توسيع نطاق الخوادم السحابية إلى مئات بسرعة للتعامل مع حركة مرور المستخدمين الهائلة. اختار فريقك Docker لنشر التطبيق. إذا كنت ستستخدم الطريقة المذكورة أعلاه للنشر، فقد يشعر المستخدمون بخيبة أمل. بحلول الوقت الذي تتعافى فيه خدمتك، ربما يكون المستخدمون قد انتقلوا إلى منصة أخرى.

هنا يأتي دور Dockerfile. وفقًا للمقدمة الرسمية من Docker:

يمكن لـ Docker بناء الصور تلقائيًا عن طريق قراءة التعليمات من Dockerfile. Dockerfile هو مستند نصي يحتوي على جميع الأوامر التي يمكن للمستخدم استدعائها عبر سطر الأوامر لتجميع صورة. باستخدام docker build، يمكن للمستخدمين إنشاء بناء تلقائي ينفذ العديد من تعليمات سطر الأوامر بشكل متتالٍ.

بعبارة أبسط، Dockerfile هو مستند نصي يحتوي على جميع الأوامر اللازمة لبناء صورة من سطر الأوامر. إنه أشبه بدليل تعليمات لتجميع مجموعة من القطع في الصورة المطلوبة.

دعنا نستكشف كيفية بناء Dockerfile من سيناريو عملي، باستخدام صورة Python كمثال. على جهازي المحلي (خارج الحاوية)، يوجد نص برمجي بايثون باسم Optimal_Hotel_Matching.py. إنه برنامج لتجميع بيانات الويب. دعنا نحاول تشغيله داخل الحاوية:

كما هو متوقع، هناك خطأ لأن مكتبة HTTP requests، وهي وحدة تابعة لجهة خارجية، غير مثبتة في صورة Python. هذا سيناريو نموذجي حيث نحتاج إلى إعداد بيئة تبعية. دعنا نحاول حل هذه المشكلة باستخدام Dockerfile.

قبل كتابة أول Dockerfile لنا، دعنا نتعرف على بعض تعليمات Dockerfile الشائعة:

  • FROM: يحدد الصورة الأساسية للبناء.
  • MAINTAINER: يصف منشئ الصورة بالاسم والبريد الإلكتروني.
  • RUN: أحد أهم الأوامر في Dockerfile. ينفذ الأوامر في الحاوية ويُسجل النتائج.
  • CMD: يحدد الأمر الذي سيتم تنفيذه عند بدء الحاوية.
  • COPY: ينسخ الملفات من المضيف إلى نظام ملفات الحاوية.
  • WORKDIR: يُعين دليل العمل لأية أوامر RUN أو CMD أو ENTRYPOINT تتبع في Dockerfile.

الآن، دعنا نكتب أول Dockerfile لنا لمعالجة احتياجاتنا: تثبيت مكتبة requests وتشغيل النص البرمجي.

هذا حل محتمل:

FROM python:3.7                             # تحديد الصورة الأساسية على أنها python:3.7
MAINTAINER ultra "tech@novita.ai"          # اسم وبريد منشئ الصورة
RUN pip install requests                   # تثبيت مكتبة requests
WORKDIR /dockerfileTest                    # تعيين دليل العمل
COPY . .                                   # نسخ محتويات الدليل الحالي إلى الحاوية
CMD ["python", "Optimal_Hotel_Matching.py"]# الأمر لتشغيل النص البرمجي

احفظ المحتوى أعلاه في ملف يُسمى Dockerfile في دليل مشروعك.

الآن، دعنا نبني الصورة باستخدام الأمر docker build، مع وضع علامة (tag) عليها لتسهيل التعرف عليها:

[root@novita dockerfileTest]# docker build --tag python:requests .
Sending build context to Docker daemon  5.12 kB
...

بعد اكتمال البناء، استخدم الأمر docker images للتحقق:

[root@novita dockerfileTest]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
python                  requests            04f20acdc288        2 hours ago         926 MB
...

يمكنك رؤية أنه تم إنشاء صورة Python جديدة موسومة بـ requests محليًا. حاول تشغيل هذه الصورة لترى ما إذا كان خطأ No module named 'requests' قد اختفى، وإذا كان البرنامج يعمل كما هو متوقع.

[root@novita dockerfileTest]# docker run python:requests
Computing distance between 116.368816,39.866464  and  116.438946,39.921624
Computing distance between 116.370910,39.869603  and  116.438946,39.921624
...

نجاح! قامت الحاوية بتشغيل الكود ثم توقفت.

هل هذه هي النهاية؟

في هذه القطعة، شاركت تطبيقًا بسيطًا لملفات Dockerfile. في بيئات الإنتاج المؤسسية الفعلية، تميل ملفات Dockerfile إلى أن تكون أكثر تعقيدًا.

Novita AI هي المنصة السحابية الشاملة التي تعزز طموحاتك في الذكاء الاصطناعي. من خلال واجهات برمجة تطبيقات متكاملة بسلاسة، وحوسبة بدون خادم، وتسريع GPU، نوفر الأدوات الفعالة من حيث التكلفة التي تحتاجها لبناء وتوسيع نطاق أعمالك القائمة على الذكاء الاصطناعي بسرعة. تخلص من متاعب البنية التحتية وابدأ مجانًا - Novita AI تجعل أحلامك في الذكاء الاصطناعي حقيقة واقعة.

قراءة موصى بها:

  1. الدليل النهائي لتطوير أداة تحسين الدقة ESRGAN 4x
  2. إتقان Stable Diffusion LoRA: استراتيجيات للنجاح