Table of Contents

मल्टी स्टेज डोकर क्या बनाता है?

मल्टी-स्टेज डॉकर बनाता है एक विशेषता है जो डॉकर 17.05 में पेश की गई है जो आपको एक एकल डॉकरफ़ाइल के भीतर एकाधिक बयानों का उपयोग करने की अनुमति देता है। प्रत्येक निर्देश एक नया चरण शुरू होता है, जिसमें इसकी अपनी खुद की आधार छवि, निर्भरता और कमांड हो सकती है। कलाकृतियों को चुनिंदा रूप से एक चरण से दूसरे चरण में कॉपी किया जा सकता है, जबकि अंतिम छवि केवल एप्लिकेशन चलाने के लिए सख्ती से आवश्यक है। यह दृष्टिकोण मैन्युअल रूप से डोकरफ़ाइल्स को श्रृंखला करने या जटिल निर्माण स्क्रिप्ट पर निर्भर करने की आवश्यकता को समाप्त करता है, और यह नाटकीय रूप से कम्पाइलर्स, विकास पुस्तकालयों और मध्यवर्ती फ़ाइलों को छोड़कर छवि के आकार को कम करता है।

कोर विचार रनटाइम वातावरण से निर्माण वातावरण को अलग करना है। एक ठेठ एकल चरण के निर्माण में, एक डेवलपर सभी निर्माण उपकरण (जैसे, कम्पाइलर, पैकेज मैनेजर, टेस्ट फ्रेमवर्क) को उसी छवि में स्थापित करता है जिसका उपयोग उत्पादन के लिए किया जाएगा। वह छवि को ब्लॉट करता है और हमले की सतह को बढ़ाता है। मल्टी-स्टेज निर्माण इसे संकलन के लिए एक मोटी, फीचर-रिच छवि का उपयोग करके हल करता है और फिर केवल परिणामस्वरूप कलाकृतियों को न्यूनतम रनटाइम छवि में कॉपी करता है जैसे या ।

बहु-स्टेज बिल्ड्स के लाभ

बहु-चरण निर्माण को अपनाने के फायदे सरल आकार में कमी से परे जाते हैं। सुरक्षा, रखरखाव और तैनाती की गति पर उनका गहरा प्रभाव पड़ता है।

1. कम छवि आकार

बिल्ड-टाइम निर्भरता को त्यागकर, बहु-चरण बिल्ड अक्सर 50% से 90% तक छवियों को सिकुड़ते हैं। उदाहरण के लिए, पूर्ण छवि (300MB से अधिक) का उपयोग करके बनाया गया एक नोड.js एप्लिकेशन को 20MB के तहत केवल बिल्ट फ़ोल्डर को एक बेस में कॉपी करके पतला किया जा सकता है। यह भंडारण बचत सीधे तेजी से पुल समय, कम नेटवर्क बैंडविड्थ और कम रजिस्ट्री लागत में बदल जाती है।

2. बेहतर सुरक्षा

प्रत्येक कंटेनर छवि में स्थापित पैकेज या उपकरण एक संभावित भेद्यता है। मल्टी-स्टेज बिल्ड आपको अंतिम छवि से संकलन, डिबगर और विकास पुस्तकालयों को बाहर करने की अनुमति देते हैं, जो हमले की सतह को काफी कम कर देते हैं। आप रनटाइम स्टेज के लिए ] या ] जैसी छवियों का भी उपयोग कर सकते हैं, जिसमें केवल एप्लिकेशन बाइनरी को निष्पादित करने के लिए न्यूनतम नहीं है।

3. सुव्यवस्थित निर्माण प्रक्रिया

सभी निर्माण चरणों को एक एकल डॉकरफ़ाइल में परिभाषित किया गया है, जिससे प्रक्रिया स्वयं निर्मित और संस्करण में आसान हो गई है। CI/CD पाइपलाइनों को एक एकल प्रविष्टि बिंदु से लाभ: डॉकरफ़ाइल। अलग-अलग निर्माण स्क्रिप्ट या मैनुअल सफाई चरणों को बनाए रखने की कोई आवश्यकता नहीं है।

4. बढ़ी हुई Reproducibility और स्थिरता

चूंकि पूरे निर्माण को एक डॉकरफ़ाइल में कैप्चर किया जाता है, इसलिए कोई भी डेवलपर या सिस्टम सटीक समान परतों को पुन: उत्पन्न कर सकता है। आधार छवियों के लिए विशिष्ट संस्करण टैग का उपयोग वातावरण में लगातार निर्माण की गारंटी देता है।

एक बहु स्टेज डॉकरफ़ाइल का निर्माण: चरण द्वारा कदम

इस walkthrough में एक उत्पादन-ready बहु-चरण Dockerfile के निर्माण को नोड.js और React आवेदन के लिए शामिल किया गया है। वही सिद्धांत किसी भी संकलित भाषा पर लागू होते हैं।

1. अपने चरणों की योजना बनाएं

कोड लिखने से पहले, आपको आवश्यक चरणों का मानचित्रण करना। एक विशिष्ट बहु-चरण निर्माण में कम से कम दो चरण होते हैं:

  • Builder stage - सभी निर्माण उपकरण स्थापित करता है, निर्भरता स्थापित करता है, और निर्माण आदेश चलाता है।
  • Runtime stage - एक न्यूनतम आधार छवि का उपयोग करता है, केवल बिल्डर चरण से निर्मित कलाकृतियों की प्रतिलिपि बनाता है, और रनटाइम व्यवहार को परिभाषित करता है।

जटिल परियोजनाओं के लिए आप परीक्षण, स्थैतिक विश्लेषण, या परिसंपत्ति संपीड़न के लिए मध्यवर्ती चरणों को जोड़ सकते हैं।

2. बिल्डर स्टेज लिखें

एक बेस छवि के साथ शुरू करें जिसमें आवश्यक टूलचेन शामिल है। का उपयोग करें के साथ बाद में उन्हें संदर्भित करने के लिए। Node.js:

FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

मुख्य बिंदु:

  • ] का प्रयोग नियतकालिक, तेजी से निर्भरता स्थापना के लिए किया जाता है।
  • ]]] को पकड़ने का लाभ उठाने के लिए जब संभव हो तो अलग परतों के रूप में आदेश देना।
  • इस मंच में केवल निर्माण उपकरण (जैसे टाइपस्क्रिप्ट, वेबपैक) स्थापित करें।

3. एक मध्यवर्ती टेस्ट स्टेज (वैकल्पिक) जोड़ें

कोड की गुणवत्ता को लागू करने के लिए, एक ऐसा चरण जोड़ें जो परीक्षण चलाता है। यह चरण बिल्डर छवि का पुन: उपयोग कर सकता है या अतिरिक्त उपकरण स्थापित कर सकता है। क्योंकि यह अंतिम चरण नहीं है, अंतिम छवि में परीक्षण विफलताएं मौजूद नहीं होंगी।

FROM builder AS test
RUN npm run test

आप इस चरण को अपने CI पाइपलाइन में चला सकते हैं, जिसमें ]] शामिल हैं, जो पूरी अंतिम छवि के निर्माण के बिना जल्दी असफलता को पकड़ने के लिए हैं।

4. रनटाइम स्टेज को परिभाषित करें

एक प्रतिक्रिया अनुप्रयोग के लिए, रनटाइम इमेज एक Nginx सर्वर हो सकता है। एक बैकएंड एपीआई के लिए, यह एक अव्यवस्थित बेस छवि या Node.js रनटाइम के साथ एक न्यूनतम अल्पाइन हो सकता है। केवल का उपयोग करके आवश्यक कलाकृतियों की प्रतिलिपि बनाएँ।

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

यदि आपको नोडे.js रनटाइम की आवश्यकता है, तो बिल्डर से की प्रतिलिपि से बचें; इसके बजाय रनटाइम चरण में उत्पादन निर्भरता की स्थापना करें:

FROM node:14-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

5. छवि का निर्माण और परीक्षण

मानक कमांड का उपयोग करके अंतिम छवि का निर्माण करें:

docker build -t myapp:latest .

आकार को सत्यापित करने के लिए, चलाएं और एक एकल चरण के निर्माण के खिलाफ तुलना करें। कंटेनर को चलाएं और आवेदन की पुष्टि सही ढंग से जवाब दें:

docker run -d -p 8080:80 myapp:latest
curl http://localhost:8080

बहु स्टेज बिल्ड्स के लिए सर्वश्रेष्ठ अभ्यास

  • ]]] ]]] ]]] ]]]] ]] ]]] ]]] ]]]] ]]]] ]]]] ]]] ]]]]] ]]]]]]]]]]]]]]]] [[FLT: [[FLT: [[FLT: [[FLT: [[FLT: [[FLT: [[[[FLT:[[FLT:[FLT:[[FLT:[[[[[[[[[[[[[[[FLT:]]]]]]]]]]]]]]]]]]]]]]]]
  • ]Optimize परत caching[ - प्रतिलिपि ] और ] शेष स्रोत कोड से पहले ताकि परत केवल अमान्य है जब निर्भरता परिवर्तन.
  • ]Leverage buildKit – buildKit को के साथ तेजी से निर्माण, इनलाइन कैशिंग और बेहतर समानांतरवाद के लिए सक्षम बनाता है।
  • ]विभिन्न वातावरण के लिए कई अंतिम चरणों का निर्माण - उदाहरण के लिए, डीबगिंग टूल के साथ एक विकास चरण और एक कठोर आधार छवि के साथ एक उत्पादन चरण।
  • Use विकास के लिए - विकास में आप लाइव रीलोड और स्रोत मानचित्र प्राप्त करने के लिए [[FLT: 30]] चरण में रुक सकते हैं, फिर [FLT: 31]]] के साथ पुनर्निर्माण।
  • ]Keep images from ] ]]] ]]] flag to use the credentials in build; उन्हें अंतिम छवि में कभी शामिल नहीं किया गया।

आम पैटर्न और उपयोग के मामले

Compiled Languages (Go, Rust, C++)

स्थिर बायनेरी के लिए, रनटाइम स्टेज (empty बेस इमेज) का उपयोग कर सकता है। केवल बाइनरी और शायद एक कॉन्फ़िगरेशन फ़ाइल कॉपी की जाती है।

FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .

FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]

पायथन अनुप्रयोग

] के साथ एक बिल्डर चरण का उपयोग निर्भरता स्थापित करने और किसी भी सी एक्सटेंशन को संकलित करने के लिए, फिर केवल एक रनटाइम चरण में स्थापित पैकेज की प्रतिलिपि बनाएँ:

FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
COPY . .

FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

एपीआई सर्वर के साथ फ्रंटेंड

दोनों एक Dockerfile में frontend और backend बनाएँ। प्रत्येक के लिए अलग बिल्डर चरणों का उपयोग करें, फिर दोनों कलाकृतियों को एक ही रनटाइम छवि में कॉपी करें:

FROM node:14-alpine AS frontend-builder
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ .
RUN npm run build

FROM node:14-alpine AS api-builder
WORKDIR /app
COPY api/package*.json ./
RUN npm ci
COPY api/ .
RUN npm run build

FROM node:14-alpine
WORKDIR /app
COPY --from=frontend-builder /app/build ./public
COPY --from=api-builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

बहु-स्टेज बिल्ड्स का समस्या निवारण

  • ]Layer caching not working – सुनिश्चित करें आदेश निर्भरता स्रोत कोड से पहले. [[FLT: 39]]]] का उपयोग अनावश्यक फ़ाइलों को बाहर करने के लिए.
  • ]]Artifact not found]]] कथन में पथ को सत्यापित करें। बिल्डर चरण को निर्दिष्ट स्थान में आउटपुट का उत्पादन करना होगा। का उपयोग करें।
  • ]Secret leak – कभी पूरी निर्देशिकाओं की प्रतिलिपि नहीं है जिसमें ] या ]]] हो सकता है। स्पष्ट रूप से केवल आवश्यक फ़ाइलों की प्रतिलिपि बनाएँ।
  • ]]: बहु-चरण के बावजूद बड़े अंतिम चित्र - जांचें कि क्या आप गलती से या पूरे स्रोत की प्रतिलिपि बना रहे हैं। का उपयोग परत के आकार को देखने के लिए करें।

निष्कर्ष

मल्टी-स्टेज डॉकर निर्माण आधुनिक कंटेनरीकरण का एक आधारशिला है। वे आपको एक एकल डॉकरफ़ाइल में निर्मित प्रक्रिया को सरल और दस्तावेज रखने के दौरान दुबला, सुरक्षित छवियों को जहाज करने में सक्षम बनाते हैं। निर्माण और रनटाइम के बीच चिंताओं को अलग करके, आप छवि के आकार को काफी कम कर सकते हैं, सुरक्षा में सुधार कर सकते हैं और सीआई / सीडी पाइपलाइनों को सुव्यवस्थित कर सकते हैं। यहां प्रदर्शित तकनीकों को लगभग किसी भी स्टैक पर लागू किया जाता है - चाहे आप नोड.जेएस, गो, पायथन, जावा या फ्रंटेंड एप्लिकेशन का निर्माण कर रहे हों। अपने मौजूदा डॉकरफ़ाइल को मल्टी-स्टेज निर्माण में परिवर्तित करके शुरू करें, और आप तुरंत गति, तैनाती दक्षता और समग्र बुनियादी ढांचे में सुधार देखेंगे।

अधिक विवरण के लिए, ]] का उल्लेख करें, ऑफिशियल डोकर मल्टी स्टेज बिल्ड डॉक्यूमेंटेशन और ]]Dockfile best practice Guide]]]. रियल-वर्ल्ड उदाहरण भी Dock Library डॉक्यूमेंटेशन]]] में उपलब्ध हैं।