Docker وTypeScript: حاويات متقدمة للتطبيقات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا الحاويات المتقدمة لـ TypeScript ضرورة

لم تعد حاويات تطبيقات TypeScript باستخدام Docker مجرد موضة - بل أصبحت معيارًا للتطوير الحديث. ومع ذلك، فإن ملفات Dockerfile الأساسية التي تنسخ المشروع بأكمله وتشغل npm start بعيدة كل البعد عن المثالية. على المستوى المتقدم، نواجه تحديات تحسين حجم الصور، وضمان الأمان، وتنظيم بنية الخدمات المصغرة، وإعداد الاسترداد التلقائي.

في هذه المقالة، سنستعرض التقنيات التي ستحول خط أنابيب Docker الخاص بك لـ TypeScript إلى معيار صناعي: عمليات البناء متعددة المراحل (multi-stage builds)، تقليل الطبقات، استخدام .dockerignore، Docker Compose للخدمات المصغرة، فحوصات الصحة (healthchecks)، والعمل مع متغيرات البيئة. جميع الأمثلة مكتوبة بلغة TypeScript وجاهزة للتكامل في المشاريع الحقيقية.



1. البناء متعدد المراحل: من التطوير إلى الإنتاج

المشكلة الرئيسية في ملفات Dockerfile الأساسية هي أنها تتضمن كل شيء في الصورة النهائية: الملفات المصدرية، node_modules للتطوير، وأدوات البناء. بالنسبة لـ TypeScript، هذا أمر بالغ الأهمية لأن tsc و devDependencies غير ضروريين في الإنتاج.

يحل البناء متعدد المراحل (multi-stage build) هذه المشكلة: المرحلة الأولى تقوم ببناء وتجميع TypeScript، والثانية تنشئ صورة مصغرة تحتوي فقط على الملفات الضرورية.



مثال على Dockerfile بمرحلتين

# المرحلة 1: بناء TypeScriptFROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY tsconfig.json ./COPY src/ ./src/RUN npm run build

# المرحلة 2: صورة الإنتاجFROM node:20-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY package.json ./EXPOSE 3000CMD ["node", "dist/index.js"]

النقاط الرئيسية:

  • استخدام npm ci - إعادة إنتاج دقيقة للتبعيات من ملف القفل.
  • نسخ dist/ و node_modules فقط - الملفات المصدرية لـ TypeScript لا تصل إلى الإنتاج.
  • صورة Alpine - قاعدة مصغرة (حوالي 5 ميجابايت).

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



بناء ثلاثي المراحل مع تبعيات التطوير

في بعض الأحيان، تحتاج إلى فصل تبعيات التطوير والإنتاج. نضيف مرحلة ثالثة لتثبيت تبعيات الإنتاج فقط:

# المرحلة 1: تثبيت جميع التبعياتFROM node:20-alpine AS depsWORKDIR /appCOPY package*.json ./RUN npm ci

# المرحلة 2: البناءFROM node:20-alpine AS builderWORKDIR /appCOPY --from=deps /app/node_modules ./node_modulesCOPY . .RUN npm run build

# المرحلة 3: الإنتاجFROM node:20-alpine AS runnerWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=deps /app/node_modules ./node_modulesCOPY package.json ./EXPOSE 3000CMD ["node", "dist/index.js"]


2. تحسين الصورة: .dockerignore، التخزين المؤقت والطبقات

كل تعليمة COPY و RUN و ADD تنشئ طبقة جديدة في Docker. كلما قلت الطبقات وكلما كان التخزين المؤقت أكثر فعالية، كلما كان البناء أسرع.



.dockerignore - مساعدك الأول

أنشئ ملف .dockerignore في جذر المشروع:

node_modulesdist.git.gitignore*.md.env.env.*Dockerfile.dockerignorecoverage.vscode.idea__tests__

يمنع هذا نسخ الملفات غير الضرورية إلى سياق البناء ويسرع نقل الملفات إلى خادم Docker.



الترتيب الصحيح للتعليمات

يقوم Docker بتخزين الطبقات مؤقتًا. إذا قمت أولاً بنسخ package.json ثم تشغيل npm ci، فسيتم إعادة استخدام هذه الطبقة طالما لم يتغير package.json. ثم انسخ الملفات المصدرية

المدونات

توصيات الكتب