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

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

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

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

परिचय: TypeScript का उन्नत कंटेनरीकरण क्यों आवश्यक है

Docker की मदद से TypeScript एप्लिकेशनों का कंटेनरीकरण लंबे समय से केवल एक चलन नहीं रह गया है - यह आधुनिक विकास का एक मानक है। हालाँकि, बुनियादी Dockerfile जो केवल पूरे प्रोजेक्ट को कॉपी करते हैं और npm start चलाते हैं, आदर्श से बहुत दूर हैं। उन्नत स्तर पर, हम इमेज के आकार को अनुकूलित करने, सुरक्षा सुनिश्चित करने, माइक्रोसर्विस आर्किटेक्चर को व्यवस्थित करने और स्वचालित पुनर्प्राप्ति सेट करने जैसे कार्यों का सामना करते हैं।

इस लेख में, हम उन तकनीकों पर चर्चा करेंगे जो TypeScript के लिए आपके Docker पाइपलाइन को एक उद्योग मानक में बदल देंगी: मल्टी-स्टेज बिल्ड, लेयर्स को कम करना, .dockerignore का उपयोग, माइक्रोसर्विसेज के लिए Docker Compose, हेल्थचेक और एनवायरनमेंट वेरिएबल्स के साथ काम करना। सभी उदाहरण TypeScript में लिखे गए हैं और वास्तविक प्रोजेक्ट्स में एकीकरण के लिए तैयार हैं।



1. मल्टी-स्टेज बिल्ड: डेवलपमेंट से प्रोडक्शन तक

बुनियादी Dockerfile की मुख्य समस्या यह है कि वे अंतिम इमेज में सब कुछ शामिल करते हैं: सोर्स कोड, डेवलपमेंट के लिए node_modules, बिल्ड टूल्स। TypeScript के लिए यह महत्वपूर्ण है, क्योंकि tsc और devDependencies प्रोडक्शन में आवश्यक नहीं हैं।

मल्टी-स्टेज बिल्ड इस समस्या को हल करता है: पहला चरण TypeScript को इकट्ठा और कंपाइल करता है, दूसरा केवल आवश्यक फाइलों के साथ एक न्यूनतम इमेज बनाता है।



दो चरणों वाले Dockerfile का उदाहरण

# चरण 1: TypeScript बिल्डFROM 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 MB)।

ऐसी इमेज का वजन सामान्य बिल्ड से 3-5 गुना कम होता है। दर्जनों डिपेंडेंसी वाले बड़े प्रोजेक्ट के लिए, अंतर सैकड़ों मेगाबाइट तक हो सकता है।



dev-डिपेंडेंसी के साथ तीन-चरणीय बिल्ड

कभी-कभी dev- और prod-डिपेंडेंसी को अलग करने की आवश्यकता होती है। केवल प्रोडक्शन डिपेंडेंसी स्थापित करने के लिए तीसरा चरण जोड़ें:

# चरण 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 नहीं बदलता। फिर सोर्स कोड कॉपी करें।

ब्लॉग

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