Sobes.tech
Middle

როგორ იყენებთ მრავალსაფეხურიან (multistage) მშენებლობას Docker-ის გამოსახულებების ოპტიმიზაციისთვის?

sobes.tech AI

პასუხი AI-სგან

მრავალსაფეხურიანი მშენებლობა საშუალებას აძლევს Dockerfile-ში გამოიყენოს რამდენიმე ეტაპი (layers), სადაც თითოეული ეტაპი თავისი ამოცანაა. ერთი ეტაპის შედეგი (მაგალითად, კომპილირებული არტეფაქტი) გადაეცემა შემდეგ ეტაპს, მაგრამ წინამორბედი ეტაპების შუა ფენები არ შედის საბოლოო სურათში.

მაგალითად, Go აპლიკაციის მშენებლობისთვის:

# მშენებლობის ეტაპი
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# საბოლოო ეტაპი
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

უპირატესობები:

  • სურათის ზომის შემცირება: საბოლოო სურათში შედის მხოლოდ აშენებული აპლიკაცია და საჭირო დამოკიდებულებები, არა მშენებლობის ინსტრუმენტები, წყაროს კოდი ან შუა ფაილები.
  • პასუხისმგებლობების განყოფილება: მშენებლობის/განთავსების ლოგიკა გამოყოფილია განთავსების ლოგიკიდან.
  • უსაფრთხოების გაზრდა: არასაჭირო ინსტრუმენტებისა და ბიბლიოთეკების ამოღებით თავდასხმის ზედაპირი მცირდება.
  • შენახვის სიჩქარის გაზრდა: ფაზებს შორის კეშირება შეიძლება შეაჩეროს განმეორებითი მშენებლობები.

მაგალითად, მოცემულ Dockerfile-ში, პირველი ფენა builder გამოიყენება Go აპლიკაციის მშენებლობისთვის. მეორე ფენა, რომელიც იწყება FROM alpine:latest, მხოლოდ პირველი ფენიდან გადმოწერილი აშენებული აპლიკაცია (COPY --from=builder /app/myapp /app/) ასუფთავებს საწყის ბაზის სურათს. საბოლოო სურათი შეიცავს მხოლოდ შესრულებადი ფაილს და საწყის ოპერაციულ სისტემას, გარეშე Go კომპილატორი და წყაროს კოდი.

ეს მნიშვნელოვნად ამცირებს სურათის ზომას ტრადიციულ მიდგომასთან შედარებით, როდესაც მშენებლობა და შესრულება ერთ კონტეინერში ხდება.