Kā jūs izmantojat daudzposmu (multistage) būvniecību Docker attēlu optimizēšanai?
sobes.tech AI
Atbilde no AI
Daudzslāņu būvniecība ļauj izmantot vairākus posmus (slāņus) Dockerfile, kur katrs posms veic savu uzdevumu. Viena posma rezultāts (piemēram, būvēts artefakts) tiek nodots nākamajam posmam, bet starpposma slāņi no iepriekšējiem posmiem netiek iekļauti galīgajā attēlā.
Piemērs lietošanai Go lietojumprogrammas būvēšanai:
# Būvniecības posms
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Galīgais posms
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Priekšrocības:
- Attēla izmēra samazināšana: Galīgajā attēlā ir tikai būvētais lietojumprogramma un nepieciešamās atkarības, nevis būvniecības rīki, avota kods un starpposma faili.
- Concerns sadalīšana: Kompilācijas/būvēšanas loģika tiek atdalīta no izvietošanas loģikas.
- Drošības uzlabošana: Samazināta uzbrukuma platība, izslēdzot nevajadzīgus rīkus un bibliotēkas no galīgā attēla.
- Būvēšanas paātrināšana: Slāņu kešatmiņa starp posmiem var paātrināt atkārtotas būvēšanas.
Piemēram, iepriekš minētajā Dockerfile, pirmais slānis builder tiek izmantots Go lietojumprogrammas kompilācijai. Otrais slānis, kas sākas ar FROM alpine:latest, kopē tikai kompilēto lietojumprogrammu no pirmā slāņa (COPY --from=builder /app/myapp /app/) uz tīru bāzes attēlu. Rezultātā galīgais attēls satur tikai izpildāmo failu un pamata operētājsistēmu, bez Go kompilatora un avota koda.
Tas būtiski samazina attēla izmēru salīdzinājumā ar tradicionālo pieeju, kad būvniecība un izpilde notiek vienā konteinerā.