Kuidas kasutate mitmetasandilist (multistage) ehitust Docker piltide optimeerimiseks?
sobes.tech AI
Vastus AI-lt
Mitmekihiline ehitus võimaldab kasutada Dockerfile'is mitmeid etappe (kihte), kus iga etapp täidab oma ülesannet. Ühe etapi tulemus (näiteks ehitatud artefakt) edastatakse järgmisele etapile, kuid eelnevate etappide vahekihte ei kaasata lõplikku pildisse.
Näide kasutusest Go rakenduse ehitamiseks:
# Ehitusetapp
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Lõplik etapp
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Eelised:
- Pildi suuruse vähendamine: Lõplik pilt sisaldab ainult ehitatud rakendust ja vajalikke sõltuvusi, mitte ehitustööriistu, lähtekoodi ja vahefaile.
- Murede eraldamine: Kompileerimise/ehitamise loogika on eraldatud juurutusloogikast.
- Turvalisuse tõstmine: Rünnaku pindala on väiksem, kuna lõplikust pildist on välja jäetud mittevajalikud tööriistad ja teegid.
- Ehituskiiruse tõstmine: Kihtide vaheline vahemälu võib kiirendada korduvaid ehitusi.
Näiteks eeltoodud Dockerfile'is kasutatakse esimene kiht builder Go rakenduse kompileerimiseks. Teine kiht, mis algab FROM alpine:latest, kopeerib ainult kompileeritud rakenduse esimesest kihist (COPY --from=builder /app/myapp /app/) puhtale baasipildile. Lõpptulemusena sisaldab lõplik pilt ainult täidetavat faili ja põhitegevusoperatsioonisüsteemi, ilma Go kompilaatori ja lähtekoodita.
See oluliselt vähendab pildi suurust võrreldes traditsioonilise lähenemisega, kus ehitus ja täitmine toimuvad samas konteineris.