“شغّال عندي!”: كيف أنقذتنا حاويات التطوير (Dev Containers) من جحيم إعداد البيئات المحلية؟

يا أهلاً وسهلاً فيكم يا جماعة الخير. اسمي أبو عمر، وأنا اليوم جاي أحكيلكم قصة صارت معي قبل كم سنة، قصة كانت تتكرر بشكل شبه يومي في عالم البرمجة، قصة كابوس اسمه “بس هو شغّال عندي!”.

بتذكرها زي كأنه امبارح. كنا شغالين على مشروع ذكاء اصطناعي كبير، وكان معنا شب جديد انضم للفريق، خلينا نسميه “سامر”. سامر شب شاطر ومتحمس، بس للأسف، قضى أول ثلاث أيام في الشركة مش بيكتب كود، لأ، كان قاعد بحاول يشغّل المشروع على جهازه اللابتوب الجديد. وأنا وباقي الفريق معه على الخط، بنحاول نساعده.

المشكلة كانت سلسلة من المصايب الصغيرة: نسخة Python عنده أحدث من النسخة اللي المشروع مبني عليها، وفي مكتبة من مكتبات معالجة الصور ما كانت راضية تتثبت عنده على نظام ويندوز لأنه ناقصها ملفات تعريف معينة، ومتغيرات البيئة (Environment Variables) كانت قصة تانية خالص. كل ما يحل مشكلة، تطلعله عشرة غيرها. وأنا كل شوي أرد عليه بنفس الجملة اللي صارت زي العلكة في تمي: “يا زلمة غريبة، الكود نظيف وشغّال عندي مية بالمية!”.

بعد ثلاث أيام من الإحباط والوقت الضايع، سامر كان على وشك يرمي اللابتوب من الشباك. في هذيك اللحظة، كلنا حسينا إنه في إشي غلط جوهري في طريقتنا بالشغل. مش معقول كل ما يجي مطور جديد أو ننتقل لجهاز جديد نرجع نعيد نفس المسرحية الهزلية هاي. من هنا بدأت رحلتي ورحلة فريقي مع حل غيّر حياتنا المهنية للأبد: حاويات التطوير (Dev Containers).

ما هو الجحيم الذي كنا نعيشه؟ (مشكلة “يعمل على جهازي”)

قبل ما نغوص في الحل، خلينا نفصّص المشكلة الأصلية اللي كل مطور فينا عانى منها. عبارة “It works on my machine” أو “شغّال عندي” هي مش مزحة، هي عرض لمرض خطير في بيئات التطوير اسمه “عدم الاتساق” (Inconsistency). وهذا المرض له عدة أسباب:

تضارب الإصدارات (Version Conflicts)

هذا هو السبب الأشهر. مشروعك مبني على Node.js إصدار 16، وزميلك عنده إصدار 18. فجأة، مكتبة معينة بطلت تشتغل أو بتعطي نتائج مختلفة. نفس القصة مع Python، Ruby، Java، وقواعد البيانات. إدارة الإصدارات المختلفة على نفس الجهاز ممكنة، بس معقدة وبتفتح باب لأخطاء لا حصر لها.

إعدادات نظام التشغيل المختلفة

الفروقات بين أنظمة التشغيل زي Windows، macOS، و Linux كانت كابوس حقيقي. أبسط مثال هو مسارات الملفات:

  • في ويندوز: C:UsersAbuOmarproject
  • في لينكس/ماك: /home/AbuOmar/project

هذا الفرق البسيط كان كفيل يكسر السكربتات وملفات الإعدادات. ناهيك عن الأوامر المختلفة في الـ Terminal وطريقة تعريف متغيرات البيئة (%VAR% مقابل $VAR).

الاعتماديات الخفية (Hidden Dependencies)

هاي المشكلة الخبيثة. أحياناً، مشروعك بيعتمد على مكتبة مثبّتة على مستوى نظام التشغيل نفسه (مثلاً imagemagick أو libpq-dev)، وأنت بتكون ثبّتها زمان ونسيت أمرها. لما يجي زميلك يشغّل المشروع، كل شي بينهار لأنه هاي المكتبة “الخفية” مش موجودة عنده، وما حدا فيكم بيعرف شو هي أصلاً!

الوقت الضائع في الإعداد (Onboarding Hell)

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

وظهر الضوء في آخر النفق: ما هي حاويات التطوير (Dev Containers)؟

ببساطة شديدة، تخيل معي إنك بتقدر تحط “بيئة التطوير الكاملة” تبعتك جوا صندوق. هذا الصندوق فيه كل شي بيحتاجه مشروعك عشان يشتغل: نظام التشغيل (عادة نسخة خفيفة من Linux)، لغة البرمجة بالإصدار المحدد، كل المكتبات المطلوبة، الإضافات (Extensions) تبعت محرر الأكواد، وحتى إعدادات المحرر نفسه.

هذا الصندوق هو ما نسميه “حاوية” (Container). وحاويات التطوير هي طريقة لاستخدام هذه الصناديق كبيئة عمل أساسية لك مباشرة من داخل محرر الأكواد المفضل لديك، وأشهرهم هو Visual Studio Code.

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

الفكرة الجوهرية: بدلاً من أن تقوم بإعداد جهازك ليتناسب مع المشروع، أنت تجلب بيئة مجهزة مسبقاً ومخصصة للمشروع لتعمل داخل جهازك. البيئة تصبح جزءاً من الكود، ويتم إدارتها والتحكم بإصداراتها مثله تماماً عبر Git.

كيف تعمل حاويات التطوير؟ (نظرة تحت الغطاء)

السحر كله يكمن في مجلد صغير تضيفه لمشروعك اسمه .devcontainer. هذا المجلد يحتوي عادة على ملفين أساسيين:

  1. devcontainer.json: ملف الإعدادات الرئيسي الذي يخبر VS Code كيف يبني ويشغّل حاوية التطوير.
  2. Dockerfile: ملف نصي يحتوي على التعليمات لبناء صورة الحاوية (Container Image) خطوة بخطوة.

الملف السحري: devcontainer.json

هذا الملف هو العقل المدبر. من خلاله، يمكنك تحديد كل شيء تقريباً عن بيئة عملك. لنلقِ نظرة على مثال بسيط لمشروع Python:


{
    "name": "My Python Project",
    "build": {
        "dockerfile": "Dockerfile"
    },

    // إعدادات خاصة بـ VS Code داخل الحاوية
    "settings": { 
        "python.pythonPath": "/usr/local/bin/python",
        "python.linting.pylintEnabled": true,
        "python.linting.enabled": true
    },

    // الإضافات التي سيتم تثبيتها تلقائياً في VS Code داخل الحاوية
    "extensions": [
        "ms-python.python",
        "ms-python.vscode-pylance"
    ],

    // أمر يتم تشغيله بعد إنشاء الحاوية (مثلاً، لتثبيت الاعتماديات)
    "postCreateCommand": "pip install -r requirements.txt",

    // ربط منفذ من الحاوية إلى جهازك المحلي (مثلاً لتطبيق ويب)
    "forwardPorts": [5000],

    // المستخدم الذي سيعمل به VS Code داخل الحاوية
    "remoteUser": "vscode"
}

لاحظ الجمال في هذا الملف: أنت لا تحدد فقط البيئة، بل تحدد أيضاً الأدوات والإعدادات التي سيستخدمها كل مطور في الفريق داخل VS Code، مما يضمن تجربة موحدة 100%.

مخطط البناء: Dockerfile

هذا الملف هو الوصفة لبناء بيئتك. إنه يحدد نظام التشغيل الأساسي، ويثبت الحزم، وينشئ المستخدمين، وينسخ الملفات. إليك Dockerfile بسيط يتماشى مع المثال أعلاه:


# ابدأ من صورة بايثون رسمية بالإصدار المطلوب
FROM python:3.9-slim-buster

# تجنب الأسئلة التفاعلية أثناء تثبيت الحزم
ARG DEBIAN_FRONTEND=noninteractive

# تحديث وتثبيت بعض الأدوات الأساسية (اختياري)
RUN apt-get update && apt-get install -y 
    git 
    && apt-get clean -y && rm -rf /var/lib/apt/lists/*

# إنشاء مستخدم غير الـ root لأسباب أمنية
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME 
    && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME 
    && apt-get install -y sudo 
    && echo $USERNAME ALL=(ALL) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME 
    && chmod 0440 /etc/sudoers.d/$USERNAME

قد يبدو هذا معقداً في البداية، لكن لا تقلق! VS Code يوفر قوالب جاهزة لمعظم لغات البرمجة، لذلك نادراً ما ستحتاج إلى كتابة هذا من الصفر.

هيا بنا نطبّق! (مثال عملي لمشروع Node.js)

الكلام النظري جميل، لكن التطبيق العملي أفضل. لنجرب إعداد حاوية تطوير لمشروع Node.js بسيط.

  1. المتطلبات: تأكد من تثبيت VS Code، Docker Desktop، وإضافة Dev Containers في VS Code.
  2. إنشاء المشروع: أنشئ مجلداً جديداً، وافتحه في VS Code.
  3. إضافة إعدادات الحاوية:
    • اضغط F1 أو Ctrl+Shift+P لفتح لوحة الأوامر (Command Palette).
    • اكتب وابحث عن: Dev Containers: Add Dev Container Configuration Files...
    • سيظهر لك قائمة طويلة من القوالب الجاهزة. اختر Node.js & JavaScript.
    • اختر إصدار Node.js الذي تريده (مثلاً، 18).
    • لا تحدد أي ميزات إضافية الآن واضغط OK.
  4. النتيجة: سيقوم VS Code بإنشاء مجلد .devcontainer يحتوي على ملفي devcontainer.json و Dockerfile جاهزين.
  5. إعادة الفتح في الحاوية: سيظهر إشعار في أسفل يمين الشاشة يسألك “Reopen in Container”. اضغط عليه.
  6. انتظر قليلاً: في المرة الأولى، سيقوم Docker ببناء صورة الحاوية. قد يستغرق هذا بضع دقائق. في المرات القادمة، ستكون العملية أسرع بكثير.

بمجرد انتهاء العملية، تهانينا! أنت الآن تعمل “داخل” الحاوية. لاحظ الشريط الأخضر في أسفل يسار نافذة VS Code الذي يظهر فيه “Dev Container: Node.js & JavaScript”.

افتح الآن الطرفية (Terminal) داخل VS Code (Ctrl+`). أنت لم تعد في طرفية Windows PowerShell أو macOS Zsh. أنت الآن داخل طرفية Linux (Bash) تعمل داخل الحاوية. جرب كتابة node --version و npm --version. سترى الإصدارات التي حددتها بالضبط، معزولة تماماً عن أي إصدارات أخرى قد تكون مثبتة على جهازك الأصلي.

نصائح من خبرة أبو عمر

بعد سنوات من استخدام هذه التقنية في مشاريع مختلفة، جمعت لكم بعض النصائح العملية:

  • ابدأ بالقوالب الجاهزة: لا تعقّد الأمور على نفسك. 90% من الحالات يمكن تغطيتها بالقوالب التي يوفرها VS Code. ابدأ منها ثم قم بتعديلها حسب الحاجة.
  • استخدم Docker Compose للتطبيقات المعقدة: إذا كان مشروعك يتطلب قاعدة بيانات (مثل PostgreSQL أو MongoDB) وخدمة Caching (مثل Redis)، فلا تقم بتثبيتها داخل نفس حاوية التطوير. استخدم Docker Compose لتعريف كل خدمة في حاويتها الخاصة، ثم قم بربط حاوية التطوير بهم. يمكنك فعل ذلك بسهولة عبر devcontainer.json.
  • شارك إعداداتك ولكن ليس أسرارك: ضع ملفات الإعدادات العامة (.devcontainer) في Git ليستخدمها كل الفريق. أما الأسرار مثل مفاتيح الـ API وكلمات المرور، فضعها في ملف .env وأضف .env إلى .gitignore. يمكن للحاوية قراءة هذه المتغيرات بسهولة.
  • تسريع عملية البناء: Docker ذكي ويستخدم التخزين المؤقت (Caching). رتّب الأوامر في Dockerfile من الأقل تغيراً إلى الأكثر تغيراً. مثلاً، ثبّت اعتماديات النظام أولاً، ثم انسخ ملفات الاعتماديات (مثل package.json) وثبّتها، وفي النهاية انسخ باقي كود المشروع.

الخلاصة: وداعاً للفوضى، أهلاً بالإنتاجية 🚀

حاويات التطوير ليست مجرد أداة جميلة، بل هي نقلة نوعية في طريقة تفكيرنا حول بيئات العمل. الفوائد واضحة وملموسة:

  • اتساق كامل: كل مطور في الفريق، سواء كان يستخدم Windows أو Mac أو Linux، يعمل في نفس البيئة الموحدة. وداعاً لعبارة “شغّال عندي!”.
  • إعداد سريع: يمكن للمطور الجديد أن يكون منتجاً خلال دقائق، وليس أيام. كل ما يحتاجه هو تثبيت VS Code و Docker، ثم فتح المشروع في الحاوية.
  • جهاز نظيف: لا حاجة لتلويث جهازك المحلي بعشرات الإصدارات المختلفة من لغات البرمجة والمكتبات. كل شيء يبقى معزولاً داخل حاويات المشاريع.
  • استنساخ سهل: هل تريد تجربة فرع جديد من الكود يتطلب إصداراً مختلفاً من لغة البرمجة؟ لا مشكلة. يمكنك بناء حاوية جديدة له دون التأثير على عملك الحالي.

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

يلا يا جماعة، جربوها واحكولي شو بصير معكم. موفقين!

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

برمجة وقواعد بيانات

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من جحيم التوقفات المجدولة؟

هل سئمت من إيقاف الخدمة مع كل تحديث لهيكلة قاعدة البيانات؟ أشارككم قصة حقيقية وكيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من ليالي النشر الطويلة والمُجهدة،...

4 يونيو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت إعادة المحاولة كارثة: كيف أنقذتنا مفاتيح عدم تكرار العمليات (Idempotency Keys) من جحيم الفواتير المزدوجة؟

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

4 يونيو، 2026 قراءة المزيد
الحوسبة السحابية

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

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

4 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كانت مهمتي البرمجية للاختبار مجرد كود: كيف أنقذني توثيق القرارات من جحيم الصمت بعد المقابلة؟

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

4 يونيو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

4 يونيو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

في هذه المقالة، أشارككم قصة حقيقية من قلب المعركة التقنية مع "خوادم ندفات الثلج" الفوضوية. سنغوص في مفهوم "الكود كبنية تحتية" (IaC) وكيف أن أدوات...

4 يونيو، 2026 قراءة المزيد
اختبارات الاداء والجودة

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

كنا نظن أن تغطية الاختبار بنسبة 100% هي درعنا الواقي، لكن الأخطاء كانت تتسلل إلى الإنتاج كاللصوص في ليل بهيم. اكتشف كيف أنقذنا "الاختبار الطفري"...

4 يونيو، 2026 قراءة المزيد
البودكاست