كتابة أول Dockerfile: تحويل سكربت Python إلى صورة (Image) معزولة
سنتعلم اليوم كيفية تحويل سكربت Python بسيط إلى صورة Docker معزولة وقابلة للتشغيل، خطوة بخطوة.
سنقوم بإنشاء ملف Dockerfile لتعريف بيئة التطبيق واعتمادياته، ثم بناء وتشغيل هذه الصورة.
الخطوة 0: إعداد ملفات التطبيق
قبل كتابة Dockerfile، نحتاج إلى سكربت Python وملف الاعتماديات الخاص به. قم بإنشاء مجلد جديد (مثلاً my_python_app) وضع الملفات التالية بداخله:
app.py
هذا هو سكربت Python الذي نريد عزله:
import datetime
import os
import requests # مكتبة إضافية لإظهار كيفية تثبيت الاعتماديات
if __name__ == "__main__":
print(f"أهلاً بك من داخل حاوية Docker!")
print(f"الوقت الحالي: {datetime.datetime.now()}")
print(f"المتغير البيئي GREETING_MESSAGE: {os.getenv('GREETING_MESSAGE', 'لم يتم تعيين رسالة ترحيب')}")
try:
response = requests.get("https://www.example.com")
print(f"تم الاتصال بـ example.com بنجاح (الكود: {response.status_code})")
except requests.exceptions.RequestException as e:
print(f"فشل الاتصال بـ example.com: {e}")
requirements.txt
هذا الملف يحدد المكتبات التي يعتمد عليها سكربت app.py:
requests
الخطوة 1: اختيار الصورة الأساسية (Base Image)
تبدأ كل Dockerfile بتحديد الصورة الأساسية التي ستبني عليها تطبيقك. هذه الصورة توفر نظام تشغيل وبيئة برمجية جاهزة.
ملاحظة تقنية: اختيار صورة أساسية خفيفة (مثل
slimأوalpine) يقلل من حجم الصورة النهائية، مما يوفر مساحة تخزين ويسرع عمليات النشر.
# الخطوة 1: تحديد الصورة الأساسية.
# نستخدم صورة Python 3.9 الرسمية المبنية على Debian (buster) بنسخة "slim" لتكون خفيفة قدر الإمكان.
FROM python:3.9-slim-buster
الخطوة 2: إعداد بيئة العمل ونسخ الملفات (Working Directory & Copy Files)
بعد اختيار الصورة الأساسية، نحتاج إلى إعداد مجلد عمل داخل الحاوية ونسخ ملفات تطبيقنا إليه.
# الخطوة 1: تحديد الصورة الأساسية.
# نستخدم صورة Python 3.9 الرسمية المبنية على Debian (buster) بنسخة "slim" لتكون خفيفة قدر الإمكان.
FROM python:3.9-slim-buster
# الخطوة 2: إعداد بيئة العمل داخل الحاوية.
# سيتم تنفيذ جميع الأوامر اللاحقة من داخل هذا المسار (/app).
WORKDIR /app
# نسخ ملف الاعتماديات أولاً للاستفادة من caching طبقات Docker.
# إذا لم يتغير requirements.txt، فلن تعيد Docker بناء هذه الطبقة والطبقات اللاحقة التي تعتمد عليها.
COPY requirements.txt .
# نسخ سكربت Python إلى مجلد العمل /app داخل الحاوية.
COPY app.py .
الخطوة 3: تثبيت الاعتماديات (Install Dependencies)
الآن بعد أن أصبحت ملفاتنا في مكانها، يجب علينا تثبيت أي مكتبات أو حزم يعتمد عليها تطبيقنا.
ملاحظة تقنية: استخدام
--no-cache-dirمعpip installيمنع pip من تخزين حزم مؤقتة، مما يقلل من حجم الصورة النهائية.
# الخطوة 1: تحديد الصورة الأساسية.
# نستخدم صورة Python 3.9 الرسمية المبنية على Debian (buster) بنسخة "slim" لتكون خفيفة قدر الإمكان.
FROM python:3.9-slim-buster
# الخطوة 2: إعداد بيئة العمل داخل الحاوية.
# سيتم تنفيذ جميع الأوامر اللاحقة من داخل هذا المسار (/app).
WORKDIR /app
# نسخ ملف الاعتماديات أولاً للاستفادة من caching طبقات Docker.
# إذا لم يتغير requirements.txt، فلن تعيد Docker بناء هذه الطبقة والطبقات اللاحقة التي تعتمد عليها.
COPY requirements.txt .
# نسخ سكربت Python إلى مجلد العمل /app داخل الحاوية.
COPY app.py .
# الخطوة 3: تثبيت المكتبات والاعتماديات المحددة في requirements.txt.
# الأمر RUN ينفذ كوماند داخل الحاوية أثناء عملية البناء.
RUN pip install --no-cache-dir -r requirements.txt
الخطوة 4: تحديد أمر التشغيل (Define Startup Command)
أخيراً، نحتاج إلى إخبار Docker بالكوماند الذي يجب تشغيله عند بدء تشغيل الحاوية من هذه الصورة.
# الخطوة 1: تحديد الصورة الأساسية.
# نستخدم صورة Python 3.9 الرسمية المبنية على Debian (buster) بنسخة "slim" لتكون خفيفة قدر الإمكان.
FROM python:3.9-slim-buster
# الخطوة 2: إعداد بيئة العمل داخل الحاوية.
# سيتم تنفيذ جميع الأوامر اللاحقة من داخل هذا المسار (/app).
WORKDIR /app
# نسخ ملف الاعتماديات أولاً للاستفادة من caching طبقات Docker.
# إذا لم يتغير requirements.txt، فلن تعيد Docker بناء هذه الطبقة والطبقات اللاحقة التي تعتمد عليها.
COPY requirements.txt .
# نسخ سكربت Python إلى مجلد العمل /app داخل الحاوية.
COPY app.py .
# الخطوة 3: تثبيت المكتبات والاعتماديات المحددة في requirements.txt.
# الأمر RUN ينفذ كوماند داخل الحاوية أثناء عملية البناء.
RUN pip install --no-cache-dir -r requirements.txt
# الخطوة 4: تحديد الأمر الذي سيتم تشغيله عند بدء تشغيل الحاوية.
# هذا هو أمر التشغيل الرئيسي لتطبيقنا. نستخدم صيغة exec لضمان التشغيل الصحيح.
CMD ["python", "app.py"]
الكود النهائي الكامل (Dockerfile)
بعد تجميع جميع الخطوات، هذا هو ملف Dockerfile النهائي الذي يجب أن تضعه في نفس المجلد مع app.py و requirements.txt:
# الخطوة 1: تحديد الصورة الأساسية. نستخدم صورة Python 3.9 الرسمية المبنية على Debian (buster) بنسخة "slim" لتكون خفيفة.
FROM python:3.9-slim-buster
# الخطوة 2: إعداد بيئة العمل داخل الحاوية.
# سيتم تنفيذ جميع الأوامر اللاحقة من داخل هذا المسار.
WORKDIR /app
# نسخ ملف الاعتماديات أولاً للاستفادة من caching طبقات Docker.
# إذا لم يتغير requirements.txt، فلن تعيد Docker بناء هذه الطبقة والطبقات السابقة.
COPY requirements.txt .
# نسخ سكربت Python إلى مجلد العمل /app داخل الحاوية.
COPY app.py .
# الخطوة 3: تثبيت المكتبات والاعتماديات المحددة في requirements.txt.
# الأمر RUN ينفذ كوماند داخل الحاوية أثناء عملية البناء.
RUN pip install --no-cache-dir -r requirements.txt
# الخطوة 4: تحديد الأمر الذي سيتم تشغيله عند بدء تشغيل الحاوية.
# هذا هو أمر التشغيل الرئيسي لتطبيقنا.
CMD ["python", "app.py"]
بناء وتشغيل الصورة
الآن بعد أن أصبح لدينا Dockerfile، يمكننا بناء الصورة وتشغيلها:
1. بناء الصورة (Build the Image)
افتح الطرفية (Terminal) في نفس المجلد الذي يحتوي على Dockerfile وملفات التطبيق، ونفذ الأمر التالي:
docker build -t my-python-app .
شرح الأمر:
docker build: أمر بناء صورة Docker.-t my-python-app: يحدد اسماً (tag) للصورة وهوmy-python-app..: يشير إلى أن Dockerfile موجود في المجلد الحالي.
2. تشغيل الحاوية (Run the Container)
بعد بناء الصورة بنجاح، يمكنك تشغيل حاوية منها:
docker run my-python-app
لتمرير متغير بيئي إلى الحاوية (كما هو موضح في سكربت app.py):
docker run -e GREETING_MESSAGE="مرحباً يا عالم من Docker!" my-python-app
النتيجة المتوقعة
عند تشغيل الحاوية باستخدام docker run my-python-app، ستشاهد مخرجات مشابهة لما يلي في الطرفية:
أهلاً بك من داخل حاوية Docker!
الوقت الحالي: 2023-10-27 10:30:45.123456
المتغير البيئي GREETING_MESSAGE: لم يتم تعيين رسالة ترحيب
تم الاتصال بـ example.com بنجاح (الكود: 200)
وإذا قمت بتشغيلها مع المتغير البيئي docker run -e GREETING_MESSAGE="مرحباً يا عالم من Docker!" my-python-app، ستكون النتيجة:
أهلاً بك من داخل حاوية Docker!
الوقت الحالي: 2023-10-27 10:31:15.789012
المتغير البيئي GREETING_MESSAGE: مرحباً يا عالم من Docker!
تم الاتصال بـ example.com بنجاح (الكود: 200)
تهانينا! لقد قمت ببناء وتشغيل أول صورة Docker لتطبيق Python الخاص بك بنجاح.