Sobes.tech
Middle

Πώς χρησιμοποιείτε την πολύ-στάδια (multistage) κατασκευή για τη βελτιστοποίηση των εικόνων Docker;

sobes.tech AI

Απάντηση από AI

Η πολύ-στάδια κατασκευή επιτρέπει τη χρήση πολλαπλών σταδίων (layers) σε ένα Dockerfile, όπου κάθε στάδιο εκτελεί το δικό του έργο. Το αποτέλεσμα ενός σταδίου (π.χ., ένα μεταγλωττισμένο artefact) περνάει στο επόμενο στάδιο, αλλά τα ενδιάμεσα στρώματα των προηγούμενων σταδίων δεν περιλαμβάνονται στη τελική εικόνα.

Παράδειγμα χρήσης για την κατασκευή μιας εφαρμογής Go:

# Στάδιο κατασκευής
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Τελικό στάδιο
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Πλεονεκτήματα:

  • Μείωση μεγέθους εικόνας: Στην τελική εικόνα περιλαμβάνονται μόνο η κατασκευασμένη εφαρμογή και οι απαραίτητες εξαρτήσεις, όχι τα εργαλεία κατασκευής, ο πηγαίος κώδικας ή τα ενδιάμεσα αρχεία.
  • Διαχωρισμός ευθυνών: Η λογική της κατασκευής/ανάπτυξης διαχωρίζεται από τη λογική ανάπτυξης.
  • Αυξημένη ασφάλεια: Μειώνεται η επιφάνεια επίθεσης με την απομάκρυνση περιττών εργαλείων και βιβλιοθηκών από την τελική εικόνα.
  • Επιτάχυνση κατασκευής: Η προσωρινή αποθήκευση των στρωμάτων μεταξύ των σταδίων μπορεί να επιταχύνει τις επαναλαμβανόμενες κατασκευές.

Για παράδειγμα, στο παρεχόμενο Dockerfile, το πρώτο στάδιο builder χρησιμοποιείται για την κατασκευή της εφαρμογής Go. Το δεύτερο στάδιο, που ξεκινά με FROM alpine:latest, αντιγράφει μόνο την κατασκευασμένη εφαρμογή από το πρώτο στάδιο (COPY --from=builder /app/myapp /app/) σε ένα καθαρό βασικό εικόνα. Το τελικό εικόνα περιέχει μόνο το εκτελέσιμο αρχείο και το βασικό λειτουργικό σύστημα, χωρίς τον μεταγλωττιστή Go και τον πηγαίο κώδικα.

Αυτό μειώνει σημαντικά το μέγεθος της εικόνας σε σύγκριση με την παραδοσιακή προσέγγιση, όπου η κατασκευή και η εκτέλεση πραγματοποιούνται σε ένα μόνο κοντέινερ.