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

أبو عمر

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

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

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

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

آخر المدونات

ادارة الفرق والتنمية البشرية

اجتماعاتنا الفردية كانت جحيمًا: كيف أنقذنا إطار عمل 1:1 من دوامة تقارير الحالة؟

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

18 أبريل، 2026 قراءة المزيد
أتمتة العمليات

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

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

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

المونوليث كان وحشًا لا يمكن المساس به: كيف أنقذنا ‘نمط الخانق’ من جحيم التجميد التطويري؟

في هذه المقالة، أشارككم قصة حقيقية من قلب المعركة مع نظام موروث "مونوليث" كاد أن يشلّ فريقنا بالكامل. سأشرح لكم بالتفصيل نمط "الخانق" (Strangler Fig...

18 أبريل، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

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

أنا أبو عمر، مطور برمجيات فلسطيني. في هذه المقالة، أشارككم قصة غيرت نظرتي للبرمجة، وكيف حولت "معايير الوصول الرقمي" (WCAG) تطبيقاتنا من قلاع مغلقة إلى...

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