يا هلا بالجميع! اليوم بتكلم عن موضوع مهم ومفيد جداً لأي واحد يشتغل على أتمتة المهام: كيف تستخدم Docker عشان تشغل سكربتات الأتمتة حقتك في بيئة معزولة ونظيفة.
ليش Docker لسكربتات الأتمتة؟
تخيل إنك كاتب سكربت بايثون يعتمد على مكتبات معينة، أو سكربت شيل يحتاج أدوات محددة. إذا شغلته على جهازك، ممكن تصير مشاكل في التبعيات (dependencies)، أو ممكن يخرب عليك إعدادات موجودة. هنا يجي دور Docker:
- عزل تام: كل سكربت يشتغل في بيئته الخاصة، ما يأثر على جهازك الأساسي ولا يتأثر بأي شي ثاني.
- تناسق: البيئة اللي يشتغل فيها السكربت بتكون نفسها بالضبط في كل مكان، سواء جهازك، سيرفر الإنتاج، أو حتى جهاز زميلك. وداعاً لمشكلة "It works on my machine!".
- سهولة النشر: بمجرد ما تبني صورة Docker، تقدر تنشرها وتشغلها في أي مكان يدعم Docker بسهولة.
- تنظيف تلقائي: بعد ما يخلص السكربت شغله، تقدر تحذف الكونتينر حقه وكأن شيئاً لم يكن.
الأساسيات: Dockerfile
كل شي يبدأ بملف اسمه Dockerfile. هذا الملف هو اللي يعلم Docker كيف يبني البيئة اللي نبيها. خلنا ناخذ مثال بسيط لسكربت بايثون.
ملاحظة: تأكد إن Docker مثبت عندك وشغال.
أول شي، سوي ملف بايثون بسيط اسمه my_script.py:
print("مرحباً من داخل Docker!")
print("هذا السكربت يعمل في بيئة معزولة.")
import os
print(f"المجلد الحالي: {os.getcwd()}")
بعدين، سوي ملف Dockerfile في نفس المجلد:
# استخدم صورة بايثون أساسية
FROM python:3.9-slim-buster
# عيّن مجلد العمل داخل الكونتينر
WORKDIR /app
# انسخ ملف السكربت إلى مجلد العمل
COPY my_script.py .
# الأوامر اللي تتنفذ لما يشتغل الكونتينر (السكربت حقنا)
CMD ["python", "my_script.py"]
بناء الصورة وتشغيل الكونتينر
الحين بعد ما سوينا Dockerfile والسكربت، نقدر نبني الصورة (Image) حقتنا. افتح الطرفية (terminal) في نفس المجلد اللي فيه الملفين ونفذ الأمر التالي:
docker build -t my-automation-script .
هذا الأمر بيبني صورة اسمها my-automation-script (تقدر تسميها باللي يعجبك). النقطة . معناها "ابحث عن Dockerfile في المجلد الحالي".
بعد ما تخلص عملية البناء، تقدر تشغل الكونتينر (Container) من الصورة اللي بنيتها:
docker run my-automation-script
وبتلاحظ إن السكربت حقك اشتغل وطبع الرسائل اللي كتبتها داخل Docker! شي بطل صح؟
تمرير ملفات أو بيانات للسكربت (Volumes)
طيب، وش لو كان السكربت حقي يحتاج يقرأ ملفات من جهازي أو يكتب عليها؟ هنا نستخدم خاصية الـ Volumes. مثلاً، لو عندك ملف إعدادات اسمه config.json تبي السكربت يقراه:
docker run -v $(pwd)/config.json:/app/config.json my-automation-script
هذا الأمر يقول لـ Docker: "خذ ملف config.json من المجلد الحالي على جهازي، وخليه متاح داخل الكونتينر في المسار /app/config.json". كذا السكربت يقدر يوصل للملف كأنه موجود داخله.
نصيحة: تقدر تمرر مجلد كامل بدال ملف واحد. مثلاً:docker run -v $(pwd)/data:/app/data my-automation-scriptعشان السكربت يقدر يقرأ ويكتب في مجلدdataعلى جهازك.
تمرير متغيرات بيئة (Environment Variables)
أحياناً تحتاج تمرر معلومات حساسة أو إعدادات للسكربت بدون ما تكون مكتوبة في ملف، مثل مفتاح API أو كلمة مرور. تقدر تستخدم متغيرات البيئة:
docker run -e API_KEY="your_secret_key" -e ENV="production" my-automation-script
داخل سكربت البايثون، تقدر توصل لها عن طريق os.environ.get('API_KEY') مثلاً.
خاتمة
Docker بيغير طريقة تعاملك مع سكربتات الأتمتة بشكل كبير. بيعطيك بيئة نظيفة، متناسقة، ومعزولة لكل مهامك. جربوه، وبتشوفون الفرق بأنفسكم! وإذا عندكم أي أسئلة، أنا موجود.