Sobes.tech
Middle

Docker şəkillərini optimallaşdırmaq üçün çox mərhələli (multistage) quruluşu necə istifadə edirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Çox mərhələli yığma Dockerfile-də bir neçə mərhələ (layers) istifadə etməyə imkan verir, burada hər mərhələ öz vəzifəsini yerinə yetirir. Bir mərhələnin nəticəsi (məsələn, tərtib olunmuş artefakt) növbəti mərhələyə ötürülür, lakin əvvəlki mərhələlərin müvəqqəti qatları son imaja daxil edilmir.

Go tətbiqinin yığılması üçün istifadə nümunəsi:

# Yığma mərhələ
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Son mərhələ
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Üstünlüklər:

  • İmza ölçüsünün azaldılması: Son imajda yalnız yığılmış tətbiq və lazım olan asılılıqlar olur, yığma alətləri, mənbə kodu və müvəqqəti fayllar daxil deyil.
  • Məsuliyyətlərin ayrılması: Yığma/yayım məntiqi yerləşdirmə məntiqindən ayrılır.
  • Təhlükəsizliyin artırılması: Gərəksiz alət və kitabxanaların çıxarılması ilə hücum sahəsi azaldılır.
  • Yığmanın sürətləndirilməsi: mərhələlər arasında keşik (cache) istifadə edilərək təkrar yığma sürətləndirilə bilər.

Məsələn, təqdim olunan Dockerfile-də, ilk mərhələ builder Go tətbiqini yığmaq üçün istifadə olunur. İkinci mərhələ, FROM alpine:latest ilə başlayır və yalnız ilk mərhələdən yığılmış tətbiqi (COPY --from=builder /app/myapp /app/) təmiz bazaya köçürür. Nəticədə, son imaj yalnız icra edilə bilən fayl və əsas əməliyyat sistemini ehtiva edir, Go tərtibçisi və mənbə kodu olmadan.

Bu, ənənəvi yanaşma ilə müqayisədə imajın ölçüsünü əhəmiyyətli dərəcədə azaldır, çünki yığma və işlətmə tək konteynerdə həyata keçirilir.