Hogyan használod a többszintű (multistage) build-et a Docker képek optimalizálására?
sobes.tech MI
Válasz az MI-től
A többlépcsős építés lehetővé teszi több szakasz (layers) használatát egy Dockerfile-ban, ahol minden szakasz saját feladatát végzi. Egy szakasz eredménye (például egy fordított artefakt) átadódik a következő szakasznak, de az előző szakaszok közbenső rétegei nem kerülnek bele a végső képbe.
Példa a Go alkalmazás fordítására:
# Fordítási szakasz
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Végső szakasz
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Előnyök:
- A kép méretének csökkentése: A végső képen csak a fordított alkalmazás és a szükséges függőségek találhatók, nem a fordítószerszámok, forráskód vagy közbenső fájlok.
- Felelősségek szétválasztása: A fordítás/telepítés logikája elkülönül a telepítési logikától.
- Biztonság növelése: A támadási felület csökkentése a szükségtelen eszközök és könyvtárak kizárásával a végső képből.
- Fordítás gyorsítása: A rétegek közötti cache gyorsíthatja az ismételt buildeket.
A példában bemutatott Dockerfile-ban az első szakasz builder a Go alkalmazás fordítására szolgál. A második szakasz, amely a FROM alpine:latest-el kezdődik, csak a fordított alkalmazást másolja át az első szakaszból (COPY --from=builder /app/myapp /app/) egy tiszta alapképre. Az eredményül kapott kép csak a futtatható fájlt és az alap operációs rendszert tartalmazza, a Go fordítót és a forráskód nélkül.
Ez jelentősen csökkenti a kép méretét a hagyományos megközelítéshez képest, ahol a fordítás és a futtatás egy konténerben történik.