Sobes.tech
Middle

Kaip naudojate daugiapakopį (multistage) statybą Docker vaizdų optimizavimui?

sobes.tech AI

Atsakymas iš AI

Daugiaslėginis kūrimas leidžia naudoti kelis etapus (layers) Dockerfile, kur kiekvienas etapas atlieka savo užduotį. Vieno etapo rezultatas (pvz., sukompiliuotas artefaktas) perduodamas kitam etapui, tačiau tarpinių etapų sluoksniai nėra įtraukiami į galutinį vaizdą.

Pavyzdys, kaip naudoti kuriant Go programą:

# Kūrimo etapas
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Galutinis etapas
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Privalumai:

  • Sumažintas vaizdo dydis: Galutiniame vaizde yra tik sukompiliuota programa ir būtinų priklausomybių, o ne kūrimo įrankiai, šaltinio kodas ar tarpiniai failai.
  • Atskiras atsakomybės: Kompiliavimo/deploy logika yra atskirta nuo diegimo logikos.
  • Padidinta saugumas: Sumažinama atakos sritis pašalinant nereikalingus įrankius ir bibliotekas iš galutinio vaizdo.
  • Kūrimo pagreitis: Klaidų kaupimas tarp etapų gali pagreitinti pakartotinį kūrimą.

Pavyzdyje pateiktame Dockerfile, pirmas etapas builder naudojamas Go programai kurti. Antras etapas, prasidedantis nuo FROM alpine:latest, kopijuoja tik sukompiliuotą programą iš pirmojo etapo (COPY --from=builder /app/myapp /app/) į švarų bazinį vaizdą. Galutinis vaizdas apima tik vykdomąjį failą ir pagrindinę operacinę sistemą, be Go kompiliatoriaus ir šaltinio kodo.

Tai žymiai sumažina vaizdo dydį, palyginti su tradiciniu požiūriu, kai kūrimas ir vykdymas vyksta viename konteineryje.