وداعاً لكابوس “يعمل على جهازي!”: كيف أنقذتنا حاويات التطوير (Dev Containers) من فوضى البيئات؟

يا مساء الخير يا جماعة، أبو عمر معكم.

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

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

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

تشخيص المشكلة: ليش “يعمل على جهازي” كابوس حقيقي؟

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

  • أنظمة تشغيل مختلفة: مطور على ويندوز، وآخر على ماك، والسيرفر شغال لينكس. كل نظام له طريقته في التعامل مع الملفات والصلاحيات.
  • إصدارات مختلفة من اللغات والمكتبات: زي ما صار معنا، اختلاف بسيط في إصدار Python, Node.js, PHP, أو أي لغة، ممكن يسبب مشاكل ما بتخطر على البال.
  • إعدادات وقواعد بيانات: واحد بيستخدم نسخة 12 من PostgreSQL، والثاني نسخة 14. واحد عنده إعداد معين في جهازه والثاني لأ.
  • متغيرات البيئة (Environment Variables): مفاتيح الـ API، وسلاسل الاتصال بقواعد البيانات… ضياع أو اختلاف متغير واحد ممكن يوقف المشروع كله.

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

الحل السحري: ما هي “حاويات التطوير” (Dev Containers)؟

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

  • نظام التشغيل المصغّر (عادةً نسخة خفيفة من لينكس).
  • اللغة اللي بتستخدمها (مثلاً Python 3.9).
  • كل المكتبات والإضافات اللي بيعتمد عليها مشروعك، بالإصدارات المحددة بالضبط.
  • حتى إضافات محرر الأكواد (VS Code extensions) اللي فريقك بيحتاجها.
  • قواعد البيانات والخدمات الأخرى (زي Redis أو PostgreSQL).

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

يعني بدل ما تشغل المشروع على جهازك (ويندوز أو ماك)، أنت بتفتح VS Code، وبكبسة زر، VS Code بيقوم ببناء هاي الحاوية وتشغيلها، وبيربط حاله فيها. فجأة، بصير الـ Terminal اللي بتكتب فيه الأوامر، والمحرر اللي بتكتب فيه الكود، كله شغال جوا بيئة لينكس نظيفة وموحدة ومثالية لمشروعك.

كيف بتشتغل هاي الشغلة؟ نظرة من تحت الغطا

السحر كله بيصير من خلال ملفين رئيسيين بتضيفهم لمشروعك:

  1. devcontainer.json: هذا هو “العقل المدبر”. ملف إعدادات بصيغة JSON بيحكي لـ VS Code كيف يبني ويشغل الحاوية.
  2. Dockerfile: هذا هو “ملف البناء”. مجموعة من التعليمات اللي بتوصف لـ Docker خطوة بخطوة كيف يبني “صورة” الحاوية (Container Image).

العقل المدبر: ملف devcontainer.json

هذا الملف بيحتوي على إعدادات مهمة جداً لـ VS Code، مثل:

  • اسم الحاوية: عشان تميزها.
  • مكان الـ Dockerfile: عشان يعرف من وين يبني.
  • إضافات VS Code: قائمة بالإضافات اللي بدك ياها تتثبت تلقائياً جوا الحاوية (مثلاً إضافة Prettier أو ESLint).
  • إعادة توجيه المنافذ (Port Forwarding): عشان لما تشغل سيرفر الويب على بورت 3000 جوا الحاوية، تقدر تفتحه من متصفحك على جهازك.
  • أوامر ما بعد الإنشاء (Post-create command): أمر بيتم تنفيذه تلقائياً بعد بناء الحاوية لأول مرة، مثل npm install.

مثال بسيط لملف .devcontainer/devcontainer.json لمشروع Node.js:


{
  "name": "My Node.js Project",
  // المسار لملف الـ Dockerfile
  "build": {
    "dockerfile": "Dockerfile"
  },

  // إضافات VS Code اللي لازم تتثبت
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode"
      ]
    }
  },

  // إعادة توجيه بورت 3000 من الحاوية للجهاز
  "forwardPorts": [3000],

  // أمر يتم تنفيذه بعد بناء الحاوية
  "postCreateCommand": "npm install",

  // اليوزر اللي هيشتغل جواه الكود
  "remoteUser": "node"
}

ملف البناء: Dockerfile

هذا الملف هو الوصفة اللي Docker بيستخدمها. كل سطر هو خطوة في بناء بيئة العمل.

مثال بسيط لملف .devcontainer/Dockerfile يكمل المثال السابق:


# ابدأ من صورة رسمية لـ Node.js إصدار 18
FROM mcr.microsoft.com/devcontainers/javascript-node:0-18

# حدد مجلد العمل الافتراضي داخل الحاوية
WORKDIR /workspace

# هذا السطر مهم عشان نتجنب إعادة تثبيت كل المكتبات مع كل تغيير
# انسخ ملفات package.json و package-lock.json أولاً
COPY package*.json ./

# ثم قم بتثبيت الاعتماديات
# RUN npm install -- --no-optional && npm ci

# الآن انسخ باقي ملفات المشروع
COPY . .

# هذا يضمن أن الملفات التي تم إنشاؤها تكون مملوكة للمستخدم الصحيح
RUN chown -R node:node /workspace

نصيحة من أبو عمر: لاحظ إني عملت تعليق (comment out) لـ RUN npm install في الـ Dockerfile. ليش؟ لأني بفضل أستخدم postCreateCommand في devcontainer.json لهي المهمة. السبب هو إن هذا الأمر بيتنفذ مرة واحدة بعد إنشاء الحاوية، وبيكون أسرع عند إعادة بنائها، وبيخلي الـ cache تبع Docker يشتغل بشكل أفضل.

يلا نطبّق عملي: مثال لمشروع Node.js

الحكي سهل، خلينا نشوف التطبيق. عشان تجرب، لازم يكون عندك:

  1. محرر Visual Studio Code.
  2. برنامج Docker Desktop مثبت وشغال.
  3. إضافة Dev Containers من متجر إضافات VS Code.

الخطوات:

  1. أنشئ مجلد جديد لمشروعك.
  2. افتح هذا المجلد باستخدام VS Code.
  3. اضغط Ctrl+Shift+P (أو Cmd+Shift+P على ماك) لفتح لوحة الأوامر (Command Palette).
  4. اكتب وابحث عن: Dev Containers: Add Dev Container Configuration Files…
  5. اختار الإعدادات المناسبة لمشروعك (مثلاً Node.js & JavaScript). اختار إصدار Node اللي بدك ياه (مثلاً 18). لا تختار أي ميزات إضافية حالياً عشان نبدأ ببساطة.
  6. VS Code رح ينشئ لك مجلد .devcontainer مع الملفات اللازمة.
  7. رح تطلعلك رسالة في الزاوية اليمين تحت تسألك إذا بدك تفتح المشروع في الحاوية (Reopen in Container). اضغط عليها.

الآن، انتظر قليلاً. في المرة الأولى، سيقوم Docker بتحميل صورة Node.js وبناء الحاوية. هذا قد يأخذ بضع دقائق. في المرات القادمة، ستكون العملية أسرع بكثير.

بعد انتهاء العملية، ستلاحظ أن VS Code أعاد تحميل نفسه، وفي الزاوية اليسار تحت صار مكتوب شي زي “Dev Container: My Node.js Project”. مبروك! أنت الآن تعمل داخل الحاوية. افتح Terminal جديد في VS Code (Ctrl+`) وجرب اكتب هاي الأوامر:


# شوف إصدار Node.js (رح يكون نفس اللي حددته)
node -v

# شوف معلومات نظام التشغيل (رح يكون لينكس!)
uname -a

الآن، أي زميل لك في الفريق يقوم بسحب المشروع من Git، كل ما عليه فعله هو فتح المشروع في VS Code، والضغط على “Reopen in Container”، وسيجد نفسه في نفس البيئة المثالية التي تعمل عليها أنت، بكل إعداداتها ومكتباتها، بدون أي وجع راس. ✨

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

  • ابدأ ببساطة: لا تحاول تحويل أضخم مشروع عندك في الشركة لحاوية تطوير من أول يوم. ابدأ بمشروع جديد أو مشروع جانبي صغير عشان تفهم المبدأ وتتعود عليه.
  • استخدم الصور الجاهزة (Pre-built Images): مايكروسوفت وفرق أخرى جهزوا صور حاويات تطوير ممتازة لأغلب اللغات والتقنيات. ابدأ منها دائماً، فهي محسّنة ومجهزة بشكل جيد.
  • postCreateCommand صديقك الصدوق: استخدم هذا الأمر لأتمتة أي خطوة تكرارية بعد بناء الحاوية، مثل تثبيت المكتبات (npm install, pip install -r requirements.txt, bundle install) أو تشغيل تهجير قاعدة البيانات (database migrations).
  • شارك مجلد .devcontainer: أهم خطوة! تأكد من إضافة مجلد .devcontainer إلى مستودع Git الخاص بك. هذا هو جوهر الموضوع كله، فهو يضمن أن أي شخص يحصل على الكود يحصل على البيئة معه.
  • إدارة الأسرار (Secrets): إياك ثم إياك أن تضع مفاتيح API أو كلمات مرور في ملفات Dockerfile أو devcontainer.json. استخدم ملفات .env التي لا يتم رفعها على Git، أو استخدم أدوات إدارة الأسرار المدمجة في VS Code.

الخلاصة: هل القصة مستاهلة؟

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

حاويات التطوير (Dev Containers) ليست مجرد أداة، بل هي نقلة نوعية في طريقة تفكيرنا في بيئات العمل. هي الوصفة السحرية لـ:

  • بيئات متسقة 100% بين كل أفراد الفريق.
  • onboarding أسرع للمطورين الجدد.
  • 💻 جهازك المحلي يبقى نظيفاً وخالياً من عشرات الإصدارات المختلفة للغات والأدوات.
  • 🐛 تقليل الأخطاء التي تحدث فقط في بيئة معينة.

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

جرّبوها، وادعولي. يلا، انطلقوا وخلّوا كابوس “يعمل على جهازي” جزءاً من الماضي. 🚀

أبو عمر

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

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

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

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

آخر المدونات

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

كانت تحديثات قاعدة البيانات كابوساً: كيف أنقذتنا أدوات الترحيل (Migrations) من جحيم التعديلات اليدوية؟

هل عانيت يوماً من تحديث مخطط قاعدة البيانات يدوياً بين فريقك؟ أبو عمر يشارككم قصة حقيقية حول كيف غيّرت أدوات الترحيل (Migrations) طريقة عمل فريقه،...

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

كانت خوادمنا تستجدي التحديثات: كيف أنقذتنا ‘خطاطيف الويب’ (Webhooks) من جحيم الاستقصاء المستمر (Polling)؟

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

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

كانت بنيتنا التحتية قصراً من رمال: كيف أنقذتنا “البنية التحتية ككود” (IaC) من جحيم البيئات المتضاربة؟

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

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

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

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

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

كانت قاعدة بياناتنا تتوسل الرحمة: كيف أنقذنا التخزين المؤقت (Caching) من جحيم الاستعلامات البطيئة

قصة حقيقية من واقع العمل عن كيفية انهيار نظامنا تحت ضغط الاستعلامات المتكررة، وكيف كان التخزين المؤقت (Caching) هو طوق النجاة. مقالة عملية للمطورين تشرح...

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

كان التحقق من هوية عملائنا يستغرق أياماً: كيف أنقذنا الذكاء الاصطناعي (eKYC) من جحيم الإجراءات اليدوية؟

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

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

كانت أعطالنا تكتشف بعد فوات الأوان: كيف أنقذنا Prometheus من جحيم المراقبة التفاعلية؟

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

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

كانت فرقنا صامتة أمام الأخطاء: كيف أنقذتنا ‘السلامة النفسية’ من جحيم ثقافة اللوم؟

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

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