Ποιες είναι οι βέλτιστες πρακτικές για τη χρήση των εντολών ADD και COPY στο Docker;
sobes.tech AI
Απάντηση από AI
Υπάρχουν ορισμένες βέλτιστες πρακτικές για τις εντολές ADD και COPY στο Docker, που στοχεύουν στη βελτίωση της ασφάλειας, της διαφάνειας και της αποδοτικότητας της κατασκευής εικόνων.
Η βασική διαφορά μεταξύ ADD και COPY:
- Το
COPYαπλώς αντιγράφει αρχεία και καταλόγους από την καθορισμένη πηγή στη συγκεκριμένη τοποθεσία μέσα στο κοντέινερ. Η πηγή πρέπει να είναι ένα τοπικό αρχείο ή κατάλογος. - Το
ADDέχει ευρύτερες δυνατότητες: μπορεί να αντιγράψει τοπικά αρχεία και καταλόγους, καθώς και να αποσυμπιέσει αρχεία (tar, gzip, bzip2) και να κατεβάσει αρχεία μέσω URL.
Βέλτιστες πρακτικές:
-
Προτιμήστε το
COPYαντί τουADD: Στις περισσότερες περιπτώσεις, τοCOPYείναι επαρκές. Είναι πιο διαφανές, καθώς απλώς αντιγράφει τοπικά αρχεία. Η χρήση τουADDγια την αποσυμπίεση αρχείων ή τη λήψη μέσω URL μπορεί να είναι λιγότερο προβλέψιμη και να αυξήσει την πολυπλοκότητα της κατασκευής. -
Χρησιμοποιήστε το
COPYγια τοπικά αρχεία: Αν χρειάζεται να αντιγράψετε αρχεία από το πλαίσιο κατασκευής στην εικόνα, πάντα χρησιμοποιείτε τοCOPY.# Αντί για ADD . /app COPY . /app -
Να είστε προσεκτικοί με τα URL στο
ADD: Η χρήση τουADDμε URL μπορεί να οδηγήσει σε αστάθεια της κατασκευής αν ο απομακρυσμένος πόρος δεν είναι διαθέσιμος. Επίσης, μπορεί να είναι λιγότερο ασφαλές, καθώς εξαρτάστε από μια εξωτερική πηγή. Συνιστάται να χρησιμοποιείτε τοcurlή τοwgetσε ένα ξεχωριστό στρώμα (RUN) για τη λήψη πόρων μέσω URL, που παρέχει μεγαλύτερο έλεγχο και δυνατότητα επαλήθευσης checksum.# Αντί για ADD http://example.com/file.tar.gz /tmp/ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \ && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \ && tar -xzf /tmp/file.tar.gz -C /app \ && rm /tmp/file.tar.gz -
Αποσυμπιέστε αρχεία σε ξεχωριστό στρώμα όταν χρησιμοποιείτε
ADD: Αν πρέπει να χρησιμοποιήσετε τοADDγια την αποσυμπίεση αρχείου (λιγότερο συνηθισμένο σενάριο), βεβαιωθείτε ότι το κάνετε σε ξεχωριστό στρώμα. Ωστόσο, όπως αναφέρθηκε προηγουμένως, η πιο συχνά προτιμώμενη πρακτική είναι η αποσυμπίεση μεRUN. -
Αντιγράψτε μόνο τα απαραίτητα αρχεία: Μην αντιγράφετε ολόκληρο το πλαίσιο κατασκευής (
COPY . /app) αν υπάρχουν περιττά αρχεία (πηγαίος κώδικας, δεδομένα δοκιμών, κρυφά directories κ.λπ.). Χρησιμοποιήστε το.dockerignoreγια να εξαιρέσετε αυτά τα αρχεία. Αυτό μειώνει το μέγεθος της εικόνας και επιταχύνει την κατασκευή, μειώνοντας τον όγκο δεδομένων που μεταφέρεται στον Docker daemon.Παράδειγμα
.dockerignore:.git node_modules *.log tmp/# Αντιγράψτε μόνο τα απαραίτητα αρχεία μετά την εφαρμογή του `.dockerignore` COPY . /app -
Χρησιμοποιήστε απόλυτες διαδρομές για τον προορισμό: Πάντα καθορίζετε απόλυτη διαδρομή στον εικόνα (/app, /usr/local/bin κ.λπ.). Αυτό καθιστά το Dockerfile πιο κατανοητό και προβλέψιμο, αποφεύγοντας την αβεβαιότητα σχετικά με τον τρέχοντα εργασιακό κατάλογο (
WORKDIR).# Πάντα καθορίζετε απόλυτη διαδρομή COPY src /app/src -
Μεταβάλλετε τη σειρά ανάλογα με τη συχνότητα αλλαγών: Τοποθετήστε τις εντολές
COPYήADDγια αρχεία που αλλάζουν σπανιότερα (π.χ. αρχεία εξαρτήσεων όπωςpackage.json,requirements.txt) πιο πάνω στο Dockerfile, και εκείνες για αρχεία που αλλάζουν συχνότερα (π.χ. ο πηγαίος κώδικας της εφαρμογής). Αυτό επιτρέπει στο Docker να χρησιμοποιεί αποτελεσματικά την cache των στρωμάτων.# Αρχεία εξαρτήσεων (αλλάζουν σπανιότερα) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Πηγαίος κώδικας της εφαρμογής (αλλάζει συχνότερα) COPY . /app/
Πίνακας σύνοψης:
| Εντολή | Περιγραφή | Συνιστώμενη χρήση | Τι να αποφεύγετε |
|---|---|---|---|
COPY |
Αντιγράφει τοπικά αρχεία/καταλόγους | Αντιγραφή τοπικών αρχείων και καταλόγων στην εικόνα | Χρησιμοποιήστε το μόνο αν δεν χρειάζεται να αποσυμπιέσετε αρχεία ή να κατεβάσετε μέσω URL |
ADD |
Αντιγράφει τοπικά αρχεία/καταλόγους, αποσυμπιέζει αρχεία, κατεβάζει μέσω URL | Χρησιμοποιήστε για αυτόματη αποσυμπίεση αρχείων (σπάνια) | Χρησιμοποιήστε το μόνο για αντιγραφή τοπικών αρχείων (προτιμάτε COPY). Χρησιμοποιήστε το για λήψη μέσω URL |
Η τήρηση αυτών των πρακτικών οδηγεί στη δημιουργία πιο αξιόπιστων, ασφαλών και αποδοτικών εικόνων Docker.