Docker tasvirlarini optimallashtirish uchun ko'p bosqichli (multistage) qurilishni qanday ishlatasiz?
sobes.tech AI
AIdan javob
Ko‘p bosqichli qurilish Dockerfile-da bir nechta bosqichlardan (layers) foydalanishga imkon beradi, bunda har bir bosqich o‘z vazifasini bajaradi. Bir bosqichning natijasi (masalan, kompilyatsiya qilingan artefakt) keyingi bosqichga uzatiladi, ammo avvalgi bosqichlarning oraliq qatlamlari yakuniy tasvirga kiritilmaydi.
Go ilovasini qurish uchun foydalanish misoli:
# Qurish bosqichi
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Yakuniy bosqich
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Afzalliklari:
- Tasvir hajmini kamaytirish: Yakuniy tasvirda faqat qurilgan ilova va zarur bo‘lgan bog‘liqliklar bo‘ladi, qurish vositalari, manba kodi yoki oraliq fayllar kiritilmaydi.
- Mas’uliyatlarni ajratish: Qurish/joylashtirish mantiqi joylashtirish mantiqidan ajratiladi.
- Xavfsizlikni oshirish: Keraksiz vositalar va kutubxonalarni chiqarish orqali hujum yuzasini kamaytiradi.
- Qurishni tezlashtirish: Bosqichlar orasidagi kechirish (cache) takroriy qurishni tezlashtirishi mumkin.
Misol uchun, taqdim etilgan Dockerfile-da, birinchi bosqich builder Go ilovasini qurish uchun ishlatiladi. Ikkinchi bosqich, FROM alpine:latest bilan boshlanadi, va faqat birinchi bosqichdan qurilgan ilovani (COPY --from=builder /app/myapp /app/) toza bazaviy tasvirga ko‘chiradi. Natijada, yakuniy tasvir faqat bajariladigan fayl va asosiy operatsion tizimni o‘z ichiga oladi, Go kompilyatori va manba kodisiz.
Bu an’anaviy yondashuvga nisbatan tasvir hajmini sezilarli darajada kamaytiradi, chunki qurish va ishga tushirish bitta konteynerda amalga oshiriladi.