إعداد المشاريع كان يلتهم أيامنا: كيف أنقذتنا ‘حاويات التطوير’ (Dev Containers) من جحيم ‘لكنه يعمل على جهازي!’؟

مقدمة: “يا أبو عمر، المشروع مش راضي يشتغل عندي!”

قبل كم سنة، انضم لفريقنا شب جديد، خلينا نسميه “سائد”، مبرمج شاطر ومتحمس وعين الله عليه. المشروع اللي كان لازم يشتغل عليه كان شوي معقد: جزء مكتوب بلغة Python مع مكتبات تعلم آلة، وجزء ثاني Node.js للواجهة الخلفية، وقاعدة بيانات PostgreSQL بإصدار معين بالزبط، وكمان Redis للكاش. باختصار، “كوكتيل” تقنيات محترم.

أعطينا سائد ملف الـ README اللي طوله كيلومتر، واللي فيه قائمة تعليمات من 37 خطوة لإعداد بيئة التطوير. قضى سائد أول يوم وهو يحاول يثبّت كل شي. ثاني يوم، طلعله خطأ غريب في مكتبة من مكتبات بايثون لأنه نسخة الـ C++ compiler على جهازه الماك كانت مختلفة عن نسختنا على لينكس. ثالث يوم، اكتشفنا إنه نسخة Node.js اللي نزلها أحدث من اللي بنستخدمها والمشروع “انضرب”.

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

هذا الموقف، اللي تكرر كثيرًا، كان هو القشة التي قصمت ظهر البعير. كان لازم نلاقي حل جذري لهذه الفوضى. وهنا بدأت رحلتنا مع ما يُعرف بـ “حاويات التطوير” أو Dev Containers.

شو القصة؟ ما هو أصل المشكلة؟

مشكلة “It works on my machine” هي عرض لمرض أعمق في عالم تطوير البرمجيات. كل مبرمج عنده جهاز بإعدادات مختلفة:

  • أنظمة تشغيل مختلفة: واحد بشتغل على Windows، والثاني على macOS، والثالث على توزيعة لينكس معينة.
  • إصدارات مختلفة من اللغات والمكتبات: هل تستخدم Python 3.9.1 أم 3.9.2؟ هل نسخة Node.js هي 16.13.0 أم 16.14.0؟ هذه الفروقات البسيطة ممكن تسبب مشاكل كبيرة.
  • متغيرات البيئة (Environment Variables): مفاتيح الـ API، وسلاسل الاتصال بقواعد البيانات، كلها تختلف من جهاز لآخر.
  • الخدمات المعتمد عليها: مثل قواعد البيانات (PostgreSQL, MySQL, MongoDB) أو خدمات التخزين المؤقت (Redis). هل إصدار قاعدة البيانات على جهازك هو نفس الإصدار على السيرفر؟

الطريقة التقليدية كانت تعتمد على توثيق كل هذه التفاصيل في ملف README.md، وتأمل أن يتبع الجميع التعليمات بحذافيرها. ولكن كما نعلم، الأمل ليس استراتيجية جيدة في هندسة البرمجيات.

الحل السحري: حاويات التطوير (Dev Containers)

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

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

ببساطة، بدلًا من تثبيت الأدوات على جهازك، أنت تقوم بتعريفها في ملفات بسيطة، وVS Code بالتعاون مع Docker يبني لك بيئة معزولة ونظيفة وجاهزة خلال دقائق.

كيف تعمل هذه التقنية؟

تعتمد الفكرة على ثلاث مكونات أساسية:

  1. Docker: هي التقنية التي تسمح لنا بإنشاء وتشغيل “الحاويات”. الحاوية هي نسخة خفيفة ومعزولة من نظام تشغيل (عادة لينكس) تحتوي على كل ما يحتاجه تطبيقك ليعمل.
  2. محرر VS Code: محرر الأكواد الشهير من مايكروسوفت.
  3. إضافة (Remote – Containers): هي الإضافة التي تربط بين VS Code و Docker، وتسمح لك بفتح مجلد مشروعك “داخل” الحاوية، وكأنك تبرمج على جهازك مباشرة.

عندما تفتح مشروعًا مُعدًا لاستخدام Dev Containers، تقوم الإضافة بقراءة ملفات الإعدادات، وبناء صورة Docker (إذا لم تكن موجودة)، ثم تشغيل حاوية منها، وتوصيل VS Code بها. والنتيجة؟ محرر الأكواد يعمل على جهازك، ولكن الـ Terminal وكل أوامر اللغة والمترجمات تعمل داخل الحاوية المعزولة. زي الحلاوة!

لنطبق عمليًا: إعداد مشروع Python بسيط

كلام النظريات حلو، بس خلينا نشوف الموضوع بشكل عملي. لنفترض أن لدينا مشروع Python بسيط ونريد إعداده باستخدام Dev Containers.

الخطوة 0: المتطلبات الأساسية

قبل أن نبدأ، تأكد من تثبيت الآتي على جهازك:

الخطوة 1: إنشاء مجلد الإعدادات

في جذر مشروعك، قم بإنشاء مجلد جديد باسم .devcontainer.

الخطوة 2: إنشاء ملف `devcontainer.json`

داخل مجلد .devcontainer، أنشئ ملفًا جديدًا باسم devcontainer.json. هذا الملف هو العقل المدبر، هو الذي يخبر VS Code بكيفية بناء بيئة التطوير. ألصق فيه الكود التالي:

{
    "name": "My Python Project",
    "build": {
        "dockerfile": "Dockerfile"
    },
    "customizations": {
        "vscode": {
            "settings": {
                "python.defaultInterpreterPath": "/usr/local/bin/python"
            },
            "extensions": [
                "ms-python.python",
                "ms-python.vscode-pylance"
            ]
        }
    },
    "forwardPorts": [8000],
    "postCreateCommand": "pip install -r requirements.txt"
}

شرح سريع للملف:

  • name: اسم سيظهر في VS Code لتمييز الحاوية.
  • build.dockerfile: يخبر VS Code أن يستخدم ملفًا اسمه Dockerfile لبناء البيئة.
  • customizations.vscode.extensions: قائمة بالإضافات التي تريد تثبيتها تلقائيًا داخل الحاوية (هنا نثبت إضافة Python الرسمية). هذا يضمن أن كل الفريق يستخدم نفس الأدوات.
  • forwardPorts: إذا كان تطبيقك يعمل على منفذ معين (مثل 8000)، هذا الإعداد سيقوم تلقائيًا بتوجيهه من الحاوية إلى جهازك.
  • postCreateCommand: أمر يتم تنفيذه مرة واحدة فقط بعد إنشاء الحاوية. هنا نستخدمه لتثبيت مكتبات Python من ملف requirements.txt.

الخطوة 3: إنشاء ملف `Dockerfile`

بجانب ملف devcontainer.json (أي داخل مجلد .devcontainer)، أنشئ ملفًا آخر باسم Dockerfile. هذا الملف يحتوي على التعليمات الفعلية لبناء بيئة اللينكس الخاصة بنا.

# ابدأ من صورة بايثون رسمية بإصدار محدد
FROM python:3.10-slim

# تعيين مجلد العمل داخل الحاوية
WORKDIR /app

# انسخ ملف المتطلبات إلى مجلد العمل
# نقوم بنسخ هذا الملف أولاً للاستفادة من التخزين المؤقت في Docker
COPY requirements.txt .

# باقي الكود سيتم تحميله بواسطة VS Code تلقائيًا

الخطوة 4: السحر يبدأ الآن!

الآن، افتح مشروعك في VS Code. سيلاحظ المحرر وجود مجلد .devcontainer وسيعرض لك إشعارًا في الزاوية اليمنى السفلية يسألك: “Folder contains a Dev Container configuration file. Reopen to develop in a container?”.

اضغط على الزر الأخضر “Reopen in Container”.

شاهد السحر يحدث: VS Code سيقوم ببناء صورة Docker (قد يستغرق هذا بعض الوقت في المرة الأولى)، ثم يشغل الحاوية، ويثبت الإضافات، وينفذ أمر postCreateCommand. بعد لحظات، سيعاد فتح VS Code وهو متصل بالكامل بالحاوية. إذا فتحت الـ Terminal المدمج (Ctrl+`)، ستجد نفسك داخل نظام لينكس، مع تثبيت Python 3.10 وكل المكتبات المطلوبة. جاهز للعمل!

هلأ، لو انضم “سائد” جديد للفريق، كل ما عليه فعله هو عمل `git clone` للمشروع، وفتحه في VS Code، والضغط على “Reopen in Container”. خلال دقائق، سيكون لديه بيئة عمل متطابقة 100% لبيئة عمل باقي الفريق. لا مزيد من الأيام الضائعة! 😉

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

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

  • ابدأ بالقوالب الجاهزة: VS Code يوفر قوالب جاهزة لأغلب اللغات والمنصات (Node.js, Python, Go, Rust, …). عند إنشاء ملف devcontainer.json لأول مرة، استخدم الأمر `Remote-Containers: Add Development Container Configuration Files…` من لوحة الأوامر (Ctrl+Shift+P) واختر القالب المناسب. هذا يوفر عليك الكثير من الوقت.
  • استخدم Docker Compose لخدمات متعددة: إذا كان مشروعك يحتاج قاعدة بيانات وخادم Redis (مثل قصة سائد)، فاستخدام ملف docker-compose.yml هو الحل الأمثل. يمكنك تعريف كل خدماتك في هذا الملف، وربطها بحاوية التطوير بسهولة.
  • لا تضع الأسرار في الكود: لا تكتب مفاتيح API أو كلمات المرور في ملفات الإعدادات. استخدم ملفات .env التي يتم تجاهلها بواسطة Git، وقم بتحميلها في الحاوية.
  • حسّن بناء الـ Dockerfile: ترتيب الأوامر في Dockerfile مهم جدًا لسرعة البناء. ضع الأوامر التي تتغير بشكل نادر في الأعلى (مثل تثبيت الأدوات الأساسية)، والأوامر التي تتغير باستمرار (مثل نسخ كود المشروع) في الأسفل للاستفادة من الـ Caching.

الخلاصة يا جماعة الخير 🚀

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

تجربة المستخدم والابداع البصري

كان تطبيقنا سجنًا رقميًا: كيف أنقذتنا ‘إمكانية الوصول’ (Accessibility) من جحيم استبعاد المستخدمين؟

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

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

كانت خوادمنا خاملة 90% من الوقت: كيف أنقذتنا ‘الحوسبة بدون خوادم’ (Serverless) من جحيم التكاليف المهدرة؟

أشارككم قصة حقيقية من تجربتي كمطور، كيف كنا ندفع مئات الدولارات على خوادم شبه نائمة، وكيف كانت معمارية "الحوسبة بدون خوادم" (Serverless) طوق النجاة الذي...

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

كانت إجاباتي في المقابلات عشوائية: كيف أنقذتني منهجية STAR من جحيم أسئلة “حدثنا عن موقف…”؟

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

14 مايو، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كيف أنقذ ‘موازن الحمل’ خادمنا الوحيد من الانهيار؟ قصة من قلب المعركة

هل يواجه تطبيقك بطئًا وتوقفًا مفاجئًا مع زيادة عدد المستخدمين؟ في هذه المقالة، أشارككم قصتي مع انهيار خادمنا الوحيد وكيف كان 'موازن الحمل' (Load Balancer)...

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

من كشط الشاشة إلى الخدمات المصرفية المفتوحة: كيف أنقذت واجهات الـ API تطبيقاتنا المالية؟

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

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

وداعاً لـ `kubectl apply -f`: كيف حولنا إدارة Kubernetes إلى عملية آلية وموثوقة مع GitOps؟

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

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