Tiny Docker εικόνες που πίστεψαν στον εαυτό τους*

[αναφορά στο αμερικάνικο παιδικό παραμύθι «The Little Engine That Could» - περ. λωρίδα]*

Tiny Docker εικόνες που πίστεψαν στον εαυτό τους*

Πώς να δημιουργήσετε αυτόματα μικροσκοπικές εικόνες Docker για τις ανάγκες σας

Ασυνήθιστη εμμονή

Τους τελευταίους δύο μήνες, έχω εμμονή με το πόσο μικρή μπορεί να είναι μια εικόνα Docker και να συνεχίζει να τρέχει η εφαρμογή;

Καταλαβαίνω, η ιδέα είναι περίεργη.

Πριν μπω στις λεπτομέρειες και τις τεχνικές λεπτομέρειες, θα ήθελα να εξηγήσω γιατί με ενόχλησε τόσο πολύ αυτό το πρόβλημα και πώς σας απασχολεί.

Γιατί το μέγεθος έχει σημασία

Μειώνοντας τα περιεχόμενα της εικόνας Docker, μειώνουμε έτσι τη λίστα των τρωτών σημείων. Επιπλέον, κάνουμε τις εικόνες πιο καθαρές, επειδή περιέχουν μόνο ό,τι χρειάζεται για την εκτέλεση εφαρμογών.

Υπάρχει ένα ακόμη μικρό πλεονέκτημα - οι εικόνες κατεβαίνουν λίγο πιο γρήγορα, αλλά, κατά τη γνώμη μου, αυτό δεν είναι τόσο σημαντικό.

Παρακαλώ σημειώστε: Εάν ανησυχείτε για το μέγεθος, η εμφάνιση της Alpine είναι μικρή και πιθανότατα θα σας ταιριάζει.

Εικόνες χωρίς διασπορά

Project Distroless προσφέρει μια επιλογή βασικών εικόνων "χωρίς διανομή", δεν περιέχουν διαχειριστές πακέτων, κελύφη και άλλα βοηθητικά προγράμματα που έχετε συνηθίσει να βλέπετε στη γραμμή εντολών. Ως αποτέλεσμα, χρησιμοποιήστε διαχειριστές πακέτων όπως pip и apt δεν θα δουλέψει:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Dockerfile με χρήση εικόνας χωρίς διανομή Python 3

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

Ο Pip δεν είναι στην εικόνα

Συνήθως αυτό το πρόβλημα επιλύεται με μια κατασκευή πολλαπλών σταδίων:

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

Συναρμολόγηση πολλαπλών σταδίων

Το αποτέλεσμα είναι μια εικόνα μεγέθους 130 MB. ΟΧΙ άσχημα! Για σύγκριση: η προεπιλεγμένη εικόνα Python ζυγίζει 929 MB και η "λεπτότερη" (3,7-slim) - 179 MB, αλπική εικόνα (3,7-alpine) είναι 98,6 MB, ενώ η βασική εικόνα χωρίς διανομή που χρησιμοποιείται στο παράδειγμα είναι 50,9 MB.

Είναι δίκαιο να επισημάνουμε ότι στο προηγούμενο παράδειγμα αντιγράφουμε έναν ολόκληρο κατάλογο /usr/local/lib/python3.7/site-packages, το οποίο μπορεί να περιέχει εξαρτήσεις που δεν χρειαζόμαστε. Αν και είναι σαφές ότι η διαφορά μεγέθους όλων των υπαρχουσών εικόνων βάσης Python ποικίλλει.

Τη στιγμή της γραφής, το Google distroless δεν υποστηρίζει πολλές εικόνες: η Java και η Python βρίσκονται ακόμα σε πειραματικό στάδιο και η Python υπάρχει μόνο για τις εκδόσεις 2,7 και 3,5.

Μικρές εικόνες

Επιστροφή στην εμμονή μου με τη δημιουργία μικρών εικόνων.

Γενικά, ήθελα να δω πώς κατασκευάζονται οι εικόνες χωρίς διασπορά. Το έργο χωρίς διανομή χρησιμοποιεί το εργαλείο κατασκευής της Google bazel. Ωστόσο, η εγκατάσταση του Bazel και η σύνταξη των δικών σας εικόνων χρειάστηκε πολλή δουλειά (και για να είμαι ειλικρινής, η επανεφεύρεση του τροχού είναι διασκεδαστική και εκπαιδευτική). Ήθελα να απλοποιήσω τη δημιουργία μικρότερων εικόνων: η πράξη δημιουργίας μιας εικόνας πρέπει να είναι εξαιρετικά απλή, τετριμμένος. Για να μην υπάρχουν αρχεία ρυθμίσεων για εσάς, μόνο μία γραμμή στην κονσόλα: просто собрать образ для <приложение>.

Έτσι, εάν θέλετε να δημιουργήσετε τις δικές σας εικόνες, τότε ξέρετε: υπάρχει μια τόσο μοναδική εικόνα docker, scratch. Το Scratch είναι μια "κενή" εικόνα, δεν υπάρχουν αρχεία σε αυτό, αν και ζυγίζει από προεπιλογή - wow! - 77 byte.

FROM scratch

Ξυστό εικόνα

Η ιδέα μιας εικόνας scratch είναι ότι μπορείτε να αντιγράψετε οποιεσδήποτε εξαρτήσεις από τον κεντρικό υπολογιστή σε αυτό και είτε να τις χρησιμοποιήσετε μέσα σε ένα αρχείο Docker (αυτό είναι σαν να τις αντιγράφετε σε apt και εγκατάσταση από την αρχή), ή αργότερα όταν υλοποιηθεί η εικόνα του Docker. Αυτό σας επιτρέπει να ελέγχετε πλήρως τα περιεχόμενα του κοντέινερ Docker και, επομένως, να ελέγχετε πλήρως το μέγεθος της εικόνας.

Τώρα πρέπει να συλλέξουμε με κάποιο τρόπο αυτές τις εξαρτήσεις. Υπάρχοντα εργαλεία όπως apt σας επιτρέπουν να κάνετε λήψη πακέτων, αλλά είναι συνδεδεμένα με το τρέχον μηχάνημα και, τελικά, δεν υποστηρίζουν Windows ή MacOS.

Ξεκίνησα λοιπόν να φτιάξω το δικό μου εργαλείο που θα δημιουργούσε αυτόματα μια βασική εικόνα του μικρότερου δυνατού μεγέθους και θα εκτελούσε επίσης οποιαδήποτε εφαρμογή. Χρησιμοποίησα πακέτα Ubuntu/Debian, έκανα μια επιλογή (παίρνω πακέτα απευθείας από τα αποθετήρια) και βρήκα αναδρομικά τις εξαρτήσεις τους. Το πρόγραμμα έπρεπε να κατεβάσει αυτόματα την πιο πρόσφατη σταθερή έκδοση του πακέτου, ελαχιστοποιώντας όσο το δυνατόν περισσότερο τους κινδύνους ασφαλείας.

Ονόμασα το εργαλείο fetchy, γιατί... βρίσκει και φέρνει... ότι χρειάζεται [από τα Αγγλικά "φέρω", "φέρω" - περίπου. λωρίδα]. Το εργαλείο λειτουργεί μέσω μιας διεπαφής γραμμής εντολών, αλλά ταυτόχρονα προσφέρει ένα API.

Για να συναρμολογήσετε μια εικόνα χρησιμοποιώντας fetchy (ας πάρουμε μια εικόνα Python αυτή τη φορά), απλά πρέπει να χρησιμοποιήσετε το CLI ως εξής: fetchy dockerize python. Μπορεί να σας ζητηθεί το λειτουργικό σύστημα προορισμού και η κωδική ονομασία επειδή fetchy επί του παρόντος χρησιμοποιεί μόνο πακέτα που βασίζονται σε Debian και Ubuntu.

Τώρα μπορείτε να επιλέξετε ποιες εξαρτήσεις δεν χρειάζονται καθόλου (στο πλαίσιο μας) και να τις εξαιρέσετε. Για παράδειγμα, η Python εξαρτάται από την perl, αν και λειτουργεί καλά χωρίς την εγκατάσταση της Perl.

Ευρήματα

Εικόνα Python που δημιουργήθηκε χρησιμοποιώντας την εντολή fetchy dockerize python3.5 ζυγίζει μόνο 35MB (είμαι παραπάνω από σίγουρος ότι στο μέλλον μπορεί να γίνει ακόμα πιο ελαφρύ). Αποδεικνύεται ότι καταφέραμε να ξυρίσουμε άλλα 15 WW από την εικόνα χωρίς διανομή.

Μπορείτε να δείτε όλες τις εικόνες που έχουν συλλεχθεί μέχρι στιγμής εδώ.

Εργο - εδώ.

Εάν λείπουν λειτουργίες, απλώς δημιουργήστε ένα αίτημα - θα χαρώ να σας βοηθήσω :) Ακόμη περισσότερο, αυτήν τη στιγμή εργάζομαι για την ενσωμάτωση άλλων διαχειριστών πακέτων στο fetchy, ώστε να μην υπάρχει ανάγκη για εκδόσεις πολλών σταδίων.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο