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

يا جماعة الخير، السلام عليكم ورحمة الله.

خلوني أحكي لكم قصة صارت معي قبل كم سنة، أيام ما كنت ماسك مشروع كبير لفريق جديد. كان معنا شب جديد، خلينا نسميه “سامر”، شب شاطر و”أبضاي” وشغله نظيف، بس كانت أول تجربة له في فريق كبير. في يوم من الأيام، كان سامر مسؤول عن ميزة جديدة في النظام، وبعد يومين من الشغل، بعتلنا “Pull Request” على GitHub وقال: “أبو عمر، تمام، الميزة جاهزة للفحص”.

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

قضينا أنا وسامر يومين كاملين، والله ما ببالغ، يومين ونحنا بنحاول نعرف ليش الكود “شغّال عنده” ومش “شغّال عندي”. مرة تطلع نسخة Node.js عنده أحدث، ومرة مكتبة مثبتة عندي مش عنده، ومرة متغير بيئة (Environment Variable) ناقص… وجعة راس ما بعدها وجعة راس. في هذيك اللحظة، عرفت إنه لازم نلاقي حل جذري، حل ينهي قصة “شغّال عندي” هاي للأبد. وهنا كانت بداية رحلتنا مع ما يُعرف اليوم بـ “حاويات التطوير” أو الـ Dev Containers.

ما هو أصل المشكلة؟ جحيم اسمه “تضارب البيئات”

قصة سامر ليست فريدة من نوعها، هي الكابوس اليومي لآلاف المبرمجين حول العالم. المشكلة الأساسية تكمن في أن كل مبرمج في الفريق يعمل على “بيئة تطوير” مختلفة:

  • أنظمة التشغيل: واحد بشتغل على Windows، والثاني على macOS، والثالث على توزيعة Linux معينة.
  • إصدارات اللغات والمكتبات: نسخة Python على جهازك قد تكون 3.9 بينما زميلك يستخدم 3.10، وهذا وحده كفيل بتوليد أخطاء غامضة.
  • الاعتماديات (Dependencies): الأدوات المثبتة على مستوى النظام، مثل قواعد البيانات (PostgreSQL, Redis) أو أدوات سطر الأوامر، تختلف من جهاز لآخر.
  • الإعدادات والتكوينات: متغيرات البيئة، مسارات الملفات، صلاحيات المستخدمين… قائمة لا تنتهي من الاختلافات الصغيرة التي تُحدث مشاكل كبيرة.

النتيجة؟ ساعات وأيام من الوقت الثمين تضيع في “تصيّد الأشباح” بدلاً من كتابة الكود وبناء الميزات. وهذا بالضبط ما جاءت تقنية الحاويات (Containers) لتحله.

Docker: الخطوة الأولى نحو الحل

أكيد أغلبكم سمع بـ Docker. ببساطة شديدة، Docker يسمح لنا بتغليف تطبيقنا مع كل ما يحتاجه ليعمل – الكود، المكتبات، الأدوات، الإعدادات – داخل “حاوية” (Container) معزولة ومستقلة. فكر فيها كصندوق شحن: لا يهم إذا كنت تنقله بسفينة أو قطار أو شاحنة، فما بداخل الصندوق يبقى كما هو ومحميًا.

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

  • دورة حياة بطيئة: كل تعديل بسيط على الكود قد يتطلب إعادة بناء صورة Docker وتشغيل الحاوية من جديد.
  • صعوبة الربط مع المحرر: كيف تجعل محرر الكود المفضل لديك (مثل VS Code) “يرى” الملفات ويتفاعل مع الأدوات الموجودة داخل الحاوية بسلاسة؟
  • إدارة معقدة: التعامل مع الـ Volumes والـ Ports والشبكات يدويًا يمكن أن يكون مربكًا.

كانت خطوة في الاتجاه الصحيح، لكنها لم تكن الحل الكامل لبيئة التطوير اليومية… حتى ظهر المنقذ.

المنقذ الحقيقي: حاويات التطوير (Dev Containers)

هنا يأتي دور الـ “Dev Containers”، وهي ميزة عبقرية مدعومة بشكل أساسي من محرر الكود VS Code. الفكرة بسيطة لكن تأثيرها هائل:

بدلًا من محاولة ربط محرر الكود على جهازك بحاوية Docker تعمل في الخلفية، ماذا لو قمنا بتشغيل VS Code “بأكمله” داخل الحاوية نفسها؟

هذا بالضبط ما تفعله Dev Containers. عندما تفتح مشروعًا باستخدام هذه الميزة، يقوم VS Code بما يلي:

  1. يبني ويشغل حاوية Docker معرفة مسبقًا.
  2. يثبّت نسخة خفيفة من الخادم الخاص به داخل الحاوية.
  3. يقوم بتوصيل واجهة المستخدم الرسومية التي تراها على شاشتك بذلك الخادم.

النتيجة؟ أنت تكتب الكود وتستخدم الطرفية (Terminal) وتُشغّل الأوامر وكأنك على جهازك المحلي، ولكن في الحقيقة، كل شيء يتم تنفيذه داخل بيئة Docker معزولة وموحدة للجميع. وداعًا لعبارة “شغّال عندي”!

شوية تقني: كيف تعمل الحكاية؟

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

  1. devcontainer.json: ملف الإعدادات الرئيسي. يخبر VS Code كيف يبني ويُكوّن بيئة التطوير.
  2. Dockerfile: ملف اختياري يصف بالتفصيل كيف يتم بناء صورة Docker الخاصة ببيئتك (مثلاً: تثبيت Python، Node.js، وأي أدوات أخرى تحتاجها).

مثال عملي: مشروع Python بسيط

تخيل أن لدينا مشروع Python يحتاج إلى نسخة 3.10 وبعض المكتبات. يمكن أن تبدو ملفات الإعداد كالتالي:

ملف .devcontainer/devcontainer.json:


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

  // الإضافات (Extensions) التي تريد تثبيتها تلقائيًا في VS Code
  "extensions": [
    "ms-python.python",
    "ms-python.vscode-pylint"
  ],

  // أمر يتم تنفيذه بعد إنشاء الحاوية لأول مرة
  "postCreateCommand": "pip install -r requirements.txt",

  // إعادة توجيه منفذ التطبيق من الحاوية إلى جهازك المحلي
  "forwardPorts": [5000]
}

ملف .devcontainer/Dockerfile:


# ابدأ من صورة Python 3.10 الرسمية
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.10

# ... يمكنك إضافة أي أوامر أخرى هنا ...
# على سبيل المثال، تثبيت أدوات على مستوى النظام
# RUN apt-get update && apt-get install -y postgresql-client

بمجرد وجود هذه الملفات في مشروعك وفتحه في VS Code، سيقترح عليك المحرر “إعادة الفتح في الحاوية” (Reopen in Container). وبكبسة زر، يتم بناء البيئة الكاملة، تثبيت المكتبات، وتجهيز كل شيء لك ولأي شخص آخر في الفريق بنفس الطريقة تمامًا.

نصائح أبو عمر العملية (من الآخر)

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

  • لا تخترع العجلة: عند إضافة Dev Container لمشروعك (من خلال Ctrl+Shift+P واختيار Add Dev Container Configuration Files...)، يوفر لك VS Code عشرات القوالب الجاهزة لـ (Node.js, Python, Go, Java, Rust…). ابدأ دائمًا من قالب جاهز ثم عدّل عليه.
  • استغل postCreateCommand: هذا الإعداد هو كنز. استخدمه لتثبيت كل الاعتماديات (مثل npm install أو bundle install) تلقائيًا. أي عضو جديد في الفريق سيحصل على بيئة جاهزة للعمل خلال دقائق بدلًا من ساعات.
  • وحّد إضافات المحرر: استخدم خاصية extensions في ملف devcontainer.json لتحديد قائمة الإضافات (Extensions) التي يجب على كل فرد في الفريق استخدامها. هذا يضمن أن الجميع يستخدم نفس أدوات الـ Linting والتنسيق (Formatting).
  • للمشاريع المعقدة، استخدم Docker Compose: إذا كان مشروعك يتكون من عدة خدمات (مثل تطبيق ويب + قاعدة بيانات + خدمة Caching)، يمكنك استخدام docker-compose.yml لوصف هذه الخدمات، ثم الإشارة إليه من داخل devcontainer.json. هذا يمنحك بيئة تطوير متكاملة تحاكي بيئة الإنتاج.

الخلاصة: استثمر في بيئتك، ترتاح في شغلك 👍

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

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

بالتوفيق في مشاريعكم، والله يعطيكم العافية.

أبو عمر

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

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

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

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

آخر المدونات

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

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (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 قراءة المزيد
البودكاست