إعداد المشاريع كان يلتهم أيامنا: كيف أنقذتنا ‘حاويات التطوير’ (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، وأنا أضمن لكم أنكم لن تنظروا إلى الوراء أبدًا.

أبو عمر

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

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

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

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

آخر المدونات

التوسع والأداء العالي والأحمال

كان مستخدمونا في الطرف الآخر من العالم ينتظرون إلى الأبد: كيف أنقذتنا شبكات توصيل المحتوى (CDN) من جحيم زمن الاستجابة المرتفع؟

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

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

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

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

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

ميزانيات الخطأ (Error Budgets): كيف أنهت كابوس مكالمات منتصف الليل وأنقذتنا من الإرهاق؟

كنا غارقين في مكالمات طوارئ ليلية لا تنتهي، فريق منهك والمنتج على المحك. في هذه المقالة، أشارككم قصة كيف أنقذنا مفهوم "ميزانيات الخطأ" (Error Budgets)...

30 مايو، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

كانت اجتماعاتنا الفردية استجواباً صامتاً: كيف حولنا الـ 1-on-1 من تقرير حالة ممل إلى محرك لنمو الفريق؟

أشارككم تجربتي كقائد فريق تقني في تحويل الاجتماعات الفردية (1-on-1s) من جلسات استجواب مملة إلى محادثات مثمرة تساهم في بناء الثقة وتطوير الفريق. هذه المقالة...

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

كانت اختباراتنا تصرخ ‘الذئب’: كيف قضينا على ‘الاختبارات المتقلبة’ (Flaky Tests) واستعدنا الثقة في خطوط الأنابيب؟

في هذه المقالة، أشارككم قصة من أرض المعركة البرمجية، وكيف تغلب فريقي على كابوس "الاختبارات المتقلبة" أو Flaky Tests. سنغوص في أسبابها الخفية، ونتعلم استراتيجيات...

30 مايو، 2026 قراءة المزيد
أدوات وانتاجية

كانت أصابعي تصرخ من التكرار: كيف أنقذتني ‘مقتطفات الشفرة’ (Code Snippets) من جحيم كتابة Boilerplate؟

أشارككم قصتي مع التكرار الممل في البرمجة وكيف غيرت "مقتطفات الشفرة" (Code Snippets) طريقة عملي تماماً. دليل عملي من مبرمج فلسطيني لزيادة إنتاجيتك والتخلص من...

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

كانت تبعياتنا قنبلة موقوتة: كيف أنقذنا ‘التحديث الآلي للتبعيات’ من جحيم الثغرات الأمنية المنسية؟

أشارككم قصة حقيقية عن ليلة كادت فيها ثغرة أمنية في إحدى المكتبات المنسية أن تدمر مشروعنا بالكامل. اكتشفوا معنا كيف تحولنا من الفوضى إلى الأمان...

30 مايو، 2026 قراءة المزيد
نصائح برمجية

كانت شفرتنا هرمًا من الهلاك: كيف أنقذتنا ‘شروط الحماية’ (Guard Clauses) من جحيم الـ if/else المتداخلة؟

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

30 مايو، 2026 قراءة المزيد
​معمارية البرمجيات

كانت خدماتنا متلاصقة كالغراء: كيف أنقذتنا ‘المعمارية الموجهة بالأحداث’ (EDA) من جحيم الاقتران المحكم؟

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

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