يا أهلاً وسهلاً فيكم يا جماعة الخير. اسمي أبو عمر، وأنا اليوم جاي أحكيلكم قصة صارت معي قبل كم سنة، قصة كانت تتكرر بشكل شبه يومي في عالم البرمجة، قصة كابوس اسمه “بس هو شغّال عندي!”.
بتذكرها زي كأنه امبارح. كنا شغالين على مشروع ذكاء اصطناعي كبير، وكان معنا شب جديد انضم للفريق، خلينا نسميه “سامر”. سامر شب شاطر ومتحمس، بس للأسف، قضى أول ثلاث أيام في الشركة مش بيكتب كود، لأ، كان قاعد بحاول يشغّل المشروع على جهازه اللابتوب الجديد. وأنا وباقي الفريق معه على الخط، بنحاول نساعده.
المشكلة كانت سلسلة من المصايب الصغيرة: نسخة Python عنده أحدث من النسخة اللي المشروع مبني عليها، وفي مكتبة من مكتبات معالجة الصور ما كانت راضية تتثبت عنده على نظام ويندوز لأنه ناقصها ملفات تعريف معينة، ومتغيرات البيئة (Environment Variables) كانت قصة تانية خالص. كل ما يحل مشكلة، تطلعله عشرة غيرها. وأنا كل شوي أرد عليه بنفس الجملة اللي صارت زي العلكة في تمي: “يا زلمة غريبة، الكود نظيف وشغّال عندي مية بالمية!”.
بعد ثلاث أيام من الإحباط والوقت الضايع، سامر كان على وشك يرمي اللابتوب من الشباك. في هذيك اللحظة، كلنا حسينا إنه في إشي غلط جوهري في طريقتنا بالشغل. مش معقول كل ما يجي مطور جديد أو ننتقل لجهاز جديد نرجع نعيد نفس المسرحية الهزلية هاي. من هنا بدأت رحلتي ورحلة فريقي مع حل غيّر حياتنا المهنية للأبد: حاويات التطوير (Dev Containers).
ما هو الجحيم الذي كنا نعيشه؟ (مشكلة “يعمل على جهازي”)
قبل ما نغوص في الحل، خلينا نفصّص المشكلة الأصلية اللي كل مطور فينا عانى منها. عبارة “It works on my machine” أو “شغّال عندي” هي مش مزحة، هي عرض لمرض خطير في بيئات التطوير اسمه “عدم الاتساق” (Inconsistency). وهذا المرض له عدة أسباب:
تضارب الإصدارات (Version Conflicts)
هذا هو السبب الأشهر. مشروعك مبني على Node.js إصدار 16، وزميلك عنده إصدار 18. فجأة، مكتبة معينة بطلت تشتغل أو بتعطي نتائج مختلفة. نفس القصة مع Python، Ruby، Java، وقواعد البيانات. إدارة الإصدارات المختلفة على نفس الجهاز ممكنة، بس معقدة وبتفتح باب لأخطاء لا حصر لها.
إعدادات نظام التشغيل المختلفة
الفروقات بين أنظمة التشغيل زي Windows، macOS، و Linux كانت كابوس حقيقي. أبسط مثال هو مسارات الملفات:
- في ويندوز:
C:UsersAbuOmarproject - في لينكس/ماك:
/home/AbuOmar/project
هذا الفرق البسيط كان كفيل يكسر السكربتات وملفات الإعدادات. ناهيك عن الأوامر المختلفة في الـ Terminal وطريقة تعريف متغيرات البيئة (%VAR% مقابل $VAR).
الاعتماديات الخفية (Hidden Dependencies)
هاي المشكلة الخبيثة. أحياناً، مشروعك بيعتمد على مكتبة مثبّتة على مستوى نظام التشغيل نفسه (مثلاً imagemagick أو libpq-dev)، وأنت بتكون ثبّتها زمان ونسيت أمرها. لما يجي زميلك يشغّل المشروع، كل شي بينهار لأنه هاي المكتبة “الخفية” مش موجودة عنده، وما حدا فيكم بيعرف شو هي أصلاً!
الوقت الضائع في الإعداد (Onboarding Hell)
النتيجة النهائية لكل ما سبق هي أن المطور الجديد يقضي أياماً، وأحياناً أسابيع، وهو يصارع في إعداد بيئة العمل المحلية بدلاً من أن يبدأ في المساهمة الفعلية في المشروع. هذا وقت ضائع، مال ضائع، وإحباط كبير للمطور الجديد والفريق بأكمله.
وظهر الضوء في آخر النفق: ما هي حاويات التطوير (Dev Containers)؟
ببساطة شديدة، تخيل معي إنك بتقدر تحط “بيئة التطوير الكاملة” تبعتك جوا صندوق. هذا الصندوق فيه كل شي بيحتاجه مشروعك عشان يشتغل: نظام التشغيل (عادة نسخة خفيفة من Linux)، لغة البرمجة بالإصدار المحدد، كل المكتبات المطلوبة، الإضافات (Extensions) تبعت محرر الأكواد، وحتى إعدادات المحرر نفسه.
هذا الصندوق هو ما نسميه “حاوية” (Container). وحاويات التطوير هي طريقة لاستخدام هذه الصناديق كبيئة عمل أساسية لك مباشرة من داخل محرر الأكواد المفضل لديك، وأشهرهم هو Visual Studio Code.
الفكرة مبنية على تقنية عظيمة اسمها Docker. إذا كنت جديداً على Docker، فكّر فيه كطريقة لتغليف تطبيقك مع كل اعتمادياته في حزمة واحدة معزولة ومستقلة تشتغل بنفس الطريقة على أي جهاز كمبيوتر في العالم. حاويات التطوير بتأخذ هاي الفكرة وبتطبقها مش بس على التطبيق النهائي، بل على بيئة التطوير نفسها.
الفكرة الجوهرية: بدلاً من أن تقوم بإعداد جهازك ليتناسب مع المشروع، أنت تجلب بيئة مجهزة مسبقاً ومخصصة للمشروع لتعمل داخل جهازك. البيئة تصبح جزءاً من الكود، ويتم إدارتها والتحكم بإصداراتها مثله تماماً عبر Git.
كيف تعمل حاويات التطوير؟ (نظرة تحت الغطاء)
السحر كله يكمن في مجلد صغير تضيفه لمشروعك اسمه .devcontainer. هذا المجلد يحتوي عادة على ملفين أساسيين:
devcontainer.json: ملف الإعدادات الرئيسي الذي يخبر VS Code كيف يبني ويشغّل حاوية التطوير.Dockerfile: ملف نصي يحتوي على التعليمات لبناء صورة الحاوية (Container Image) خطوة بخطوة.
الملف السحري: devcontainer.json
هذا الملف هو العقل المدبر. من خلاله، يمكنك تحديد كل شيء تقريباً عن بيئة عملك. لنلقِ نظرة على مثال بسيط لمشروع Python:
{
"name": "My Python Project",
"build": {
"dockerfile": "Dockerfile"
},
// إعدادات خاصة بـ VS Code داخل الحاوية
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.linting.pylintEnabled": true,
"python.linting.enabled": true
},
// الإضافات التي سيتم تثبيتها تلقائياً في VS Code داخل الحاوية
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance"
],
// أمر يتم تشغيله بعد إنشاء الحاوية (مثلاً، لتثبيت الاعتماديات)
"postCreateCommand": "pip install -r requirements.txt",
// ربط منفذ من الحاوية إلى جهازك المحلي (مثلاً لتطبيق ويب)
"forwardPorts": [5000],
// المستخدم الذي سيعمل به VS Code داخل الحاوية
"remoteUser": "vscode"
}
لاحظ الجمال في هذا الملف: أنت لا تحدد فقط البيئة، بل تحدد أيضاً الأدوات والإعدادات التي سيستخدمها كل مطور في الفريق داخل VS Code، مما يضمن تجربة موحدة 100%.
مخطط البناء: Dockerfile
هذا الملف هو الوصفة لبناء بيئتك. إنه يحدد نظام التشغيل الأساسي، ويثبت الحزم، وينشئ المستخدمين، وينسخ الملفات. إليك Dockerfile بسيط يتماشى مع المثال أعلاه:
# ابدأ من صورة بايثون رسمية بالإصدار المطلوب
FROM python:3.9-slim-buster
# تجنب الأسئلة التفاعلية أثناء تثبيت الحزم
ARG DEBIAN_FRONTEND=noninteractive
# تحديث وتثبيت بعض الأدوات الأساسية (اختياري)
RUN apt-get update && apt-get install -y
git
&& apt-get clean -y && rm -rf /var/lib/apt/lists/*
# إنشاء مستخدم غير الـ root لأسباب أمنية
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
&& apt-get install -y sudo
&& echo $USERNAME ALL=(ALL) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME
&& chmod 0440 /etc/sudoers.d/$USERNAME
قد يبدو هذا معقداً في البداية، لكن لا تقلق! VS Code يوفر قوالب جاهزة لمعظم لغات البرمجة، لذلك نادراً ما ستحتاج إلى كتابة هذا من الصفر.
هيا بنا نطبّق! (مثال عملي لمشروع Node.js)
الكلام النظري جميل، لكن التطبيق العملي أفضل. لنجرب إعداد حاوية تطوير لمشروع Node.js بسيط.
- المتطلبات: تأكد من تثبيت VS Code، Docker Desktop، وإضافة Dev Containers في VS Code.
- إنشاء المشروع: أنشئ مجلداً جديداً، وافتحه في VS Code.
- إضافة إعدادات الحاوية:
- اضغط
F1أوCtrl+Shift+Pلفتح لوحة الأوامر (Command Palette). - اكتب وابحث عن:
Dev Containers: Add Dev Container Configuration Files... - سيظهر لك قائمة طويلة من القوالب الجاهزة. اختر
Node.js & JavaScript. - اختر إصدار Node.js الذي تريده (مثلاً، 18).
- لا تحدد أي ميزات إضافية الآن واضغط OK.
- اضغط
- النتيجة: سيقوم VS Code بإنشاء مجلد
.devcontainerيحتوي على ملفيdevcontainer.jsonوDockerfileجاهزين. - إعادة الفتح في الحاوية: سيظهر إشعار في أسفل يمين الشاشة يسألك “Reopen in Container”. اضغط عليه.
- انتظر قليلاً: في المرة الأولى، سيقوم Docker ببناء صورة الحاوية. قد يستغرق هذا بضع دقائق. في المرات القادمة، ستكون العملية أسرع بكثير.
بمجرد انتهاء العملية، تهانينا! أنت الآن تعمل “داخل” الحاوية. لاحظ الشريط الأخضر في أسفل يسار نافذة VS Code الذي يظهر فيه “Dev Container: Node.js & JavaScript”.
افتح الآن الطرفية (Terminal) داخل VS Code (Ctrl+`). أنت لم تعد في طرفية Windows PowerShell أو macOS Zsh. أنت الآن داخل طرفية Linux (Bash) تعمل داخل الحاوية. جرب كتابة node --version و npm --version. سترى الإصدارات التي حددتها بالضبط، معزولة تماماً عن أي إصدارات أخرى قد تكون مثبتة على جهازك الأصلي.
نصائح من خبرة أبو عمر
بعد سنوات من استخدام هذه التقنية في مشاريع مختلفة، جمعت لكم بعض النصائح العملية:
- ابدأ بالقوالب الجاهزة: لا تعقّد الأمور على نفسك. 90% من الحالات يمكن تغطيتها بالقوالب التي يوفرها VS Code. ابدأ منها ثم قم بتعديلها حسب الحاجة.
- استخدم Docker Compose للتطبيقات المعقدة: إذا كان مشروعك يتطلب قاعدة بيانات (مثل PostgreSQL أو MongoDB) وخدمة Caching (مثل Redis)، فلا تقم بتثبيتها داخل نفس حاوية التطوير. استخدم Docker Compose لتعريف كل خدمة في حاويتها الخاصة، ثم قم بربط حاوية التطوير بهم. يمكنك فعل ذلك بسهولة عبر
devcontainer.json. - شارك إعداداتك ولكن ليس أسرارك: ضع ملفات الإعدادات العامة (
.devcontainer) في Git ليستخدمها كل الفريق. أما الأسرار مثل مفاتيح الـ API وكلمات المرور، فضعها في ملف.envوأضف.envإلى.gitignore. يمكن للحاوية قراءة هذه المتغيرات بسهولة. - تسريع عملية البناء: Docker ذكي ويستخدم التخزين المؤقت (Caching). رتّب الأوامر في
Dockerfileمن الأقل تغيراً إلى الأكثر تغيراً. مثلاً، ثبّت اعتماديات النظام أولاً، ثم انسخ ملفات الاعتماديات (مثلpackage.json) وثبّتها، وفي النهاية انسخ باقي كود المشروع.
الخلاصة: وداعاً للفوضى، أهلاً بالإنتاجية 🚀
حاويات التطوير ليست مجرد أداة جميلة، بل هي نقلة نوعية في طريقة تفكيرنا حول بيئات العمل. الفوائد واضحة وملموسة:
- ✅ اتساق كامل: كل مطور في الفريق، سواء كان يستخدم Windows أو Mac أو Linux، يعمل في نفس البيئة الموحدة. وداعاً لعبارة “شغّال عندي!”.
- ✅ إعداد سريع: يمكن للمطور الجديد أن يكون منتجاً خلال دقائق، وليس أيام. كل ما يحتاجه هو تثبيت VS Code و Docker، ثم فتح المشروع في الحاوية.
- ✅ جهاز نظيف: لا حاجة لتلويث جهازك المحلي بعشرات الإصدارات المختلفة من لغات البرمجة والمكتبات. كل شيء يبقى معزولاً داخل حاويات المشاريع.
- ✅ استنساخ سهل: هل تريد تجربة فرع جديد من الكود يتطلب إصداراً مختلفاً من لغة البرمجة؟ لا مشكلة. يمكنك بناء حاوية جديدة له دون التأثير على عملك الحالي.
نصيحتي الأخيرة لكم: لا تترددوا. في مشروعكم القادم، أو حتى في مشروع شخصي صغير، خصصوا ساعة واحدة لتجربة إعداد حاوية تطوير له. قد تبدو الخطوات الأولى مخيفة قليلاً، لكنني أضمن لكم أن العائد على هذا الاستثمار الصغير في الوقت سيكون هائلاً على المدى الطويل. ستتخلصون من مصدر كبير للإحباط والصداع، وستركزون على ما يهم حقاً: كتابة كود رائع.
يلا يا جماعة، جربوها واحكولي شو بصير معكم. موفقين!