Docker और TypeScript: एप्लिकेशनों का उन्नत कंटेनरीकरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Docker और TypeScript: एप्लिकेशनों का उन्नत कंटेनरीकरण

\n\n

Docker की मदद से TypeScript एप्लिकेशनों का कंटेनरीकरण सिर्फ कोड को इमेज में पैक करना नहीं है। उन्नत स्तर पर, यह ऑप्टिमाइज़ेशन, सुरक्षा और ऑटोमेशन की कला है। इस लेख में, हम जानेंगे कि TypeScript के लिए कुशल Docker इमेज कैसे बनाएं, एनवायरनमेंट को कैसे मैनेज करें और CI/CD पाइपलाइन में कंटेनरीकरण को कैसे एकीकृत करें। आप सीखेंगे कि इमेज के आकार को 5-10 गुना कैसे कम करें, बिल्ड को गति दें और डिपेंडेंसी आइसोलेशन में सुधार करें।

\n\n

1. TypeScript के लिए मल्टी-स्टेज बिल्ड

\n\n

TypeScript के लिए Docker इमेज की क्लासिक समस्या फाइनल इमेज में सभी डेवलपमेंट टूल्स को शामिल करना है: TypeScript कंपाइलर, dev-डिपेंडेंसी, सोर्स फाइलें। इससे इमेज का आकार बहुत बड़ा हो जाता है (अक्सर > 1 GB)। समाधान मल्टी-स्टेज बिल्ड है।

\n\n

विचार सरल है: पहला चरण (build) TypeScript को JavaScript में कंपाइल करता है और सभी डिपेंडेंसी स्थापित करता है। दूसरा चरण (production) केवल तैयार JavaScript और production-डिपेंडेंसी को कॉपी करता है।

\n\n
# चरण 1: बिल्ड\nFROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=development\nCOPY . .\nRUN npm run build\n\n# चरण 2: प्रोडक्शन\nFROM node:20-alpine AS production\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/package*.json ./\nRUN npm ci --only=production\nEXPOSE 3000\nCMD ["node", "dist/index.js"]
\n\n

यह दृष्टिकोण इमेज के आकार को ~800 MB से घटाकर ~150 MB कर देता है। --only=development और --only=production पर ध्यान दें - ये डिपेंडेंसी को अलग करने के लिए महत्वपूर्ण फ्लैग हैं।

\n\n

2. Docker लेयर कैशिंग का ऑप्टिमाइज़ेशन

\n\n

Dockerfile में प्रत्येक निर्देश एक लेयर बनाता है। यदि लेयर नहीं बदली है, तो Docker उन्हें कैश करता है। पुनः बिल्ड की गति के लिए निर्देशों का सही क्रम महत्वपूर्ण है।

\n\n

खराब उदाहरण (कैश तोड़ता है):

\n
FROM node:20-alpine\nWORKDIR /app\nCOPY . .\nRUN npm ci\nRUN npm run build\nCMD ["node", "dist/index.js"]
\n\n

यहां सोर्स कोड में कोई भी बदलाव (README.md में भी) npm ci और बिल्ड के कैश को रीसेट कर देता है।

\n\n

अच्छा उदाहरण (कैश बनाए रखता है):

\n
FROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json tsconfig.json ./\nRUN npm ci --only=development\nCOPY src ./src\nRUN npm run build
\n\n

यह क्यों काम करता है? डिपेंडेंसी शायद ही कभी बदलती हैं, जबकि सोर्स कोड अक्सर बदलता है। package*.json को अलग से कॉपी करके, हम सुनिश्चित करते हैं कि npm ci वाली लेयर केवल इन फाइलों के बदलने पर ही पुनः बने।

\n\n

3. एनवायरनमेंट वेरिएबल और सीक्रेट के साथ कार्य

\n\n

Node.js पर TypeScript एप्लिकेशनों के लिए एनवायरनमेंट वेरिएबल का उपयोग मानक है। हालांकि, Docker में कुछ बारीकियां हैं।

\n\n

सामान्य गलती: Dockerfile में ENV के माध्यम से संवेदनशील डेटा (API-कुंजी, पासवर्ड) पास करना। यह इमेज की लेयर हिस्ट्री में सीक्रेट छोड़ देता है।

\n\n

सही दृष्टिकोण:

\n
    \n
  • कंटेनर चलाते समय --env-file का उपयोग करें
  • \n
  • प्रोडक्शन के लिए Docker Secrets (Swarm में) या Kubernetes Secrets का उपयोग करें
  • \n
  • स्थानीय डेवलपमेंट के लिए docker-compose के साथ .env फ़ाइल का उपयोग करें
  • \n
\n\n

docker-compose.yml का उदाहरण:

\n
version: '3.8'\nservices:\n  app:\n    build: .\n    ports:\n      - "3000:3000"\n    env_file:\n      - .env.production\n    volumes:\n      - ./logs:/app/logs
\n\n

TypeScript कोड में वेरिएबल लोड करने के लिए dotenv लाइब्रेरी का उपयोग करें:

\n
import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\ndotenv.config({ path: resolve(__dirname, '../.env') });\n\nconst config = {\n  port: parseInt(process.env.PORT || '3000', 10),\n  dbUrl: process.env.DATABASE_URL,\n  apiKey: process.env.API_KEY\n};\n\nexport default config;
\n\n

महत्वपूर्ण: वास्तविक .env फ़ाइलों को कभी भी कमिट न करें

ब्लॉग

पुस्तक अनुशंसाएँ