परिचय: TypeScript एप्लिकेशन को कंटेनरीकृत क्यों करें?
आधुनिक सॉफ्टवेयर विकास कंटेनरीकरण के बिना अकल्पनीय है। Docker अलग-अलग वातावरणों में एप्लिकेशन को पैकेज करने, वितरित करने और चलाने के लिए डी-फैक्टो मानक बन गया है। TypeScript — JavaScript के एक सख्ती से टाइप किए गए सुपरसेट — के साथ मिलकर, Docker पूर्वानुमेयता, पोर्टेबिलिटी सुनिश्चित करता है और CI/CD प्रक्रियाओं को सरल बनाता है।
इस लेख में, हम समझेंगे कि TypeScript एप्लिकेशन को सही तरीके से कैसे कंटेनरीकृत किया जाए: बुनियादी Dockerfile से लेकर docker-compose और मल्टी-स्टेज बिल्ड का उपयोग करके production-ready बिल्ड तक। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें, इमेज का आकार कैसे कम करें और डिप्लॉयमेंट को कैसे तेज़ करें।
मूल बातें: Docker में TypeScript और Node.js
TypeScript एक ऐसी भाषा है जो JavaScript में कंपाइल होती है। इसका मतलब है कि कंटेनर में TypeScript एप्लिकेशन चलाने के लिए, हमें पहले सोर्स कोड को कंपाइल करना होगा और फिर Node.js का उपयोग करके प्राप्त JavaScript को निष्पादित करना होगा। Docker इस प्रक्रिया को स्वचालित करने के लिए आदर्श है।
एक सरल TypeScript एप्लिकेशन बनाना
शुरू करने के लिए, TypeScript पर एक न्यूनतम एप्लिकेशन बनाते हैं। प्रोजेक्ट संरचना:
my-ts-app/├── src/│ └── index.ts├── package.json├── tsconfig.json└── Dockerfilesrc/index.ts:
import express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req: Request, res: Response) => { res.json({ message: 'Hello from TypeScript + Docker!' });});
app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`);});package.json:
{ "name": "my-ts-app", "version": "1.0.0", "scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts" }, "dependencies": { "express": "^4.18.2" }, "devDependencies": { "@types/express": "^4.17.21", "@types/node": "^20.11.0", "typescript": "^5.3.3", "ts-node": "^10.9.2" }}tsconfig.json:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["src/**/*"]}बुनियादी Dockerfile
पहला, सबसे सरल Dockerfile विकल्प:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]यह Dockerfile पूरे प्रोजेक्ट को कॉपी करता है, डिपेंडेंसी इंस्टॉल करता है, TypeScript को कंपाइल करता है और एप्लिकेशन को चलाता है। हालाँकि, इस दृष्टिकोण में कमियाँ हैं: इमेज का आकार बड़ा है, और लेयर कैशिंग अकुशल है।
ऑप्टिमाइज़ेशन: मल्टी-स्टेज बिल्ड और आकार कम करना
production वातावरण के लिए, मल्टी-स्टेज बिल्ड (multi-stage build) का उपयोग करने की अनुशंसा की जाती है। यह बिल्ड और निष्पादन चरणों को अलग करने की अनुमति देता है, जिससे अंतिम इमेज में केवल आवश्यक फ़ाइलें रह जाती हैं।
मल्टी-स्टेज बिल्ड के साथ Production Dockerfile
# Stage 1: BuildFROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./RUN npm ci --only=production
COPY . .RUN npm run build
# Stage 2: ProductionFROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/package.json ./
EXPOSE 3000
USER node
CMD ["node", "dist/index.js"]इस दृष्टिकोण के लाभ:
- छोटा इमेज आकार — अंतिम लेयर में केवल कंपाइल किया गया कोड और production डिपेंडेंसी होती है।
- सुरक्षा — कंटेनर में TypeScript का सोर्स कोड, dev