مشکل ایمیجهای حجیم
در زبانهایی مثل Go یا در پروژههای فرانتاند که نیاز به کامپایل یا build دارند، ابزارهای ساخت (کامپایلر، وابستگیهای توسعه) خودشان حجم زیادی دارند اما در زمان اجرای نهایی برنامه به آنها نیازی نیست. ساخت چندمرحلهای (Multi-stage Build) به شما اجازه میدهد از چند مرحلهی FROM در یک Dockerfile استفاده کنید تا فقط نتیجهی نهایی وارد image آخر شود.
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
در این مثال، مرحلهی اول با نام build پروژهی React یا Vue را با Node.js میسازد. مرحلهی دوم یک image بسیار سبکتر بر پایهی nginx است که فقط فایلهای خروجی build (پوشهی dist) را از مرحلهی اول کپی میکند، بدون اینکه Node.js یا وابستگیهای توسعه در image نهایی باقی بمانند.
نتیجه: ایمیجهای کوچکتر و امنتر
نتیجهی این روش، image نهایی بسیار کوچکتری است که فقط شامل چیزهای لازم برای اجرا (نه ساخت) برنامه است. این کار هم سرعت دانلود و دیپلوی image را افزایش میدهد و هم سطح حملهی امنیتی (attack surface) را کاهش میدهد، چون ابزارهای توسعه که میتوانند نقاط ضعف امنیتی داشته باشند، در image نهایی وجود ندارند. Multi-stage build یکی از مهمترین تکنیکهای حرفهای در نوشتن Dockerfileهای production است.