Table of Contents
چند ساخت Docker چیست؟
Multi-stage Docker build یک ویژگی معرفی شده در Docker 17.05 است که به شما اجازه می دهد از چندین استفاده کنید:0 [در یک فایل] تک تک فایل ها، هر یک از آنها دستورالعمل یک مرحله جدید را آغاز می کند، که می تواند به طور چشمگیری تصویر پایه، وابستگی ها و دستورات را حذف کند.
ایده اصلی این است که محیط ساخت را از محیط زمان اجرا جدا کنید. [در یک ساختار معمولی تک مرحله ای، یک توسعه دهنده همه ابزارهای ساخت (به عنوان مثال، کامپایلرها، مدیران بسته، چارچوب های آزمون) را در همان تصویر که برای تولید استفاده می شود نصب می کند.این تصویر را خنثی می کند و سطح حمله را افزایش می دهد. Multi-stage این را با استفاده از یک ویژگی ضخیم (F) حل می کند و تنها به عنوان یک نتیجه کپی برداری می شود.
مزایای ساخت های چند طبقه
مزایای اتخاذ چند مرحله ای، فراتر از کاهش اندازه ساده است.آنها تاثیر عمیقی بر امنیت، حفظ و سرعت استقرار دارند.
کاهش اندازه تصویر
با دور زدن وابستگی های زمان ساخت، چندین مرحله اغلب تصاویر را 50 تا 90 درصد کاهش می دهد، به عنوان مثال، یک برنامه Node.js ساخته شده با استفاده از کامل تصویر (بیش از 300MB) می تواند به کمتر از 20MB با کپی کردن تنها بلوک ساخته شده است:5 پوشه به یک پایگاه : این ذخیره سازی به طور مستقیم، ذخیره سازی شبکه، و هزینه های کمتر، و رجیستری کمتر، و هزینه های رجیستری.
۲- بهبود امنیت
هر بسته نصب شده یا ابزار در یک تصویر container یک آسیب پذیری بالقوه است. Multi-stage می سازد که به شما اجازه می دهد کامپایلرها، کنفدراسیون ها و کتابخانه های توسعه را از تصویر نهایی حذف کنید، به طور قابل توجهی سطح حمله را کاهش دهید.شما حتی می توانید از تصاویر مانند (FLT-7 یا (FLT:8 برای مرحله اجرا، که تنها حاوی حداقل لخت برای اجرای برنامه باینری است، استفاده کنید.
3- فرآیند ساخت خط مشی
همه مراحل ساخت در یک Dockerfile واحد تعریف شده اند و فرایند خود را به سادگی و به نسخه خود اختصاص می دهند. CI / خط لوله CD از یک نقطه ورود واحد بهره مند می شوند: Dockerfile نیازی به حفظ اسکریپت های جداگانه ساخت یا مراحل تمیز دستی نیست.
۴- افزایش قابلیت و سازگاری
از آنجا که کل ساخت در یک Dockerfile ثبت شده است، هر توسعه دهنده یا سیستم می تواند لایه های دقیق را بازتولید کند.استفاده از تگ های نسخه خاص برای تصاویر پایه، تضمین های سازگار در محیط های مختلف را تضمین می کند.
ساخت یک فایل چند طبقه: مرحله با مرحله
این پیاده روی شامل ایجاد یک فایل چند مرحله ای آماده برای یک Node.js و React است. اصول مشابهی برای هر زبان کامپایل شده اعمال می شود.
۱- مرحله های خود را برنامه ریزی کنید
قبل از نوشتن کد، مراحلی را که نیاز دارید را مشخص کنید.یک ساختار چند مرحله ای معمولی حداقل دو مرحله دارد:
- مرحله ساخت - نصب همه ابزار ساخت، نصب وابستگی ها و اجرای دستور ساخت.
- مرحله اجرا - از یک تصویر پایه حداقل استفاده می کند، فقط مصنوعات ساخته شده از مرحله سازنده را کپی می کند و رفتار زمان اجرا را تعریف می کند.
برای پروژه های پیچیده شما ممکن است مراحل متوسط برای تست ها، تجزیه و تحلیل استاتیک یا فشرده سازی دارایی را اضافه کنید.
مرحله سازنده را بنویسید
با یک تصویر پایه شروع کنید که شامل ابزار مورد نیاز است. مراحل نام گذاری شده با برای مرجع آنها بعدا.
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
نکات کلیدی:
- استفاده از آن برای نصب سریع تر و سریع تر است.
- در صورت امکان، به صورت جداگانه به صورت جداگانه عمل کنید.
- نصب ابزار (مانند TypeScript، webpack) در این مرحله تنها
مرحله تست متوسط (اختیاری)
برای اجرای کیفیت کد، مرحله ای را اضافه کنید که تست ها را اجرا می کند.این مرحله می تواند از تصویر سازنده استفاده کند یا ابزارهای اضافی را نصب کند، زیرا مرحله نهایی نیست، شکست های تست در تصویر نهایی وجود نخواهد داشت.
FROM builder AS test
RUN npm run test
شما می توانید این مرحله را در خط لوله CI خود با اجرا کنید تا بدون ایجاد کل تصویر نهایی، شکست های اولیه را به دست آورید.
مرحله ی زمانی را تعریف کنید
برای یک برنامه React، تصویر زمان اجرا می تواند یک سرور Nginx باشد.برای یک API backend، ممکن است یک تصویر پایه ای بی نظیر یا حداقل آلپ با Node.js اجرا زمان کپی فقط مصنوعات ضروری با استفاده از باشد.
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
اگر به زمان اجرا Node.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"]
۵- ساخت و آزمایش تصویر
تصویر نهایی را با استفاده از دستور استاندارد بسازید:
docker build -t myapp:latest .
برای تأیید اندازه، اجرا کنید (FLT 20) و مقایسه در برابر یک ساخت تک مرحله ای.
docker run -d -p 8080:80 myapp:latest
curl http://localhost:8080
بهترین روش برای ساخت های چند طبقه
- از تگ های خاص تصویر پایه استفاده کنید [FLT 1 ]، از ] برای جلوگیری از غافلگیری ها اجتناب کنید.
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۳] [۳] [۳] [۳] [۳] [۱۰] [۱]] [۳] [۳] [۱۰] [۳]] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- [[۱] [۱۰] [۱] [۱۰]] [۱۰] [۱]]] [۱]] [۱]] [۱]]- [۱]]- [۱]-]- [۳]- [۱]-۳]- [۱]- [۳]- [۱]-۳] [۳] [۳] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳]]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- ایجاد مراحل نهایی متعدد برای محیط های مختلف [FLT 1] - به عنوان مثال، یک مرحله توسعه با ابزار اشکال زدایی و مرحله تولید با یک تصویر پایه سخت است.
- استفاده از [FLT 29] برای توسعه ساخت در توسعه شما می توانید در مرحله برای دریافت دوباره زنده و نقشه منبع، سپس بازسازی با [FLT 31] برای تولید متوقف کنید.
- اسرار را از تصاویر دور نگه دارید - از پرچم Docker BuildKit استفاده کنید اگر نیاز به ارسال مدارک در طول ساخت دارید؛ هرگز آنها را در تصویر نهایی قرار ندهید.
الگوهای مشترک و استفاده از موارد
زبان های تکمیل شده (Go, Rust, C++)
برای ایستگاه های استاتیک، مرحله اجرا می تواند از (تصویر پایه خالی) استفاده کند، فقط باینری و شاید یک فایل پیکربندی کپی شده است.
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"]
برنامه های Python Application
از یک مرحله سازنده با برای نصب وابستگی ها و جمع آوری هر پسوند C استفاده کنید، سپس فقط بسته های نصب شده را به مرحله اجرا کنید:
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"]
Frontend با API Server
هر دو frontend و backend را در یک Dockerfile بسازید. از مراحل جداگانه سازنده برای هر کدام استفاده کنید، سپس هر دو مصنوعات را به یک تصویر زمان اجرا شده کپی کنید:
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"]
دانلود بازی Multi-Stage Builds
- [[۱] [۱۰] [۱] [۱۰] [۱۰] [۱۰]] [۱۰]] [۱۰] [۱]] [۱۰] [۱]] [۱۰]] [۱] [۱۰] [۱]]] [۱۰] [۱]] [۳]] [۳] [۳] [۳]] [۳] برای حذف فایل های غیر ضروری [۳]
- [[۱] [۱۰] [[۱۰]]] [[۱۰]]] [۱]]] [۱]] [۱]] [۱]] [۱]]] [۱]] [۱]] [۱]]] [۱]] [۱]] [۱۰]] [۱]] [۱]] [۳] [۱] [۳] [۱]] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۱]] [۱] [۱]]] [۱] [۱] [۱]] [۱]] [۱] [۱]]]]]]]] [۱] [۱] [۳] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۱]] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [
- - هرگز کل دایرکتوری ها را که ممکن است شامل یا باشد، کپی نکنید.
- (FLT:0) تصاویر نهایی را علی رغم چند مرحله ای [FLT 1] بررسی کنید که آیا به طور تصادفی از یا کل منبع استفاده می کنید.
نتیجه گیری
Multi-stage Docker ساخت یک سنگ بنای مدرن containerization است.آنها شما را قادر می سازند تا تصاویر ناب و ایمن را در حالی که فرآیند ساخت ساده و مستند در یک Dockerfile واحد است، با جدا کردن نگرانی بین ساخت و اجرا زمان، شما می توانید به شدت کاهش اندازه تصویر، بهبود امنیت، و ساده CI / خط لوله های CD. تکنیک های نشان داده شده در اینجا به اعمال تقریبا هر پشته - چه شما ساخت زیرساخت های فعلی، و یا سرعت، و یا شروع به سرعت، و یا شروع برنامه های اتصال چند نوار جلو، سرعت، و یا شروع، سرعت نصب، سرعت.
برای جزئیات بیشتر، به اسناد چند مرحله ای رسمی Docker اشاره کنید و بهترین شیوه ها راهنمای نمونه های دنیای واقعی نیز در اسناد کتابخانه [FLT5:5:5.