पाठ 20 / 26

मल्टी-स्टेज बिल्ड

एक स्टेज में कंपाइल करें, अंतिम छोटी इमेज में केवल रनटाइम आर्टिफ़ैक्ट भेजें।

इसकी ज़रूरत क्यों?

बिल्ड टूल्स, कंपाइलर, और सोर्स कोड अक्सर रनटाइम पर ज़रूरी नहीं होते, फिर भी एक-स्टेज Dockerfile उन्हें भेज देता है — जिससे इमेज और उसकी अटैक सतह बढ़ जाती है।

बिल्ड स्टेज + रनटाइम स्टेज

AS से किसी स्टेज को नाम दें, फिर COPY --from=<stage> केवल बना हुआ आर्टिफ़ैक्ट पतली अंतिम इमेज में लाता है — कंपाइलर और dev डिपेंडेंसी कभी उसमें नहीं जातीं।

# --- build stage ---
FROM node:20 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build

# --- runtime stage ---
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY package.json .
RUN npm install --production
CMD ["node", "dist/server.js"]