Sobes.tech
Middle

Ποιες είναι οι βέλτιστες πρακτικές για τη χρήση των εντολών ADD και COPY στο Docker;

sobes.tech AI

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

Υπάρχουν ορισμένες βέλτιστες πρακτικές για τις εντολές ADD και COPY στο Docker, που στοχεύουν στη βελτίωση της ασφάλειας, της διαφάνειας και της αποδοτικότητας της κατασκευής εικόνων.

Η βασική διαφορά μεταξύ ADD και COPY:

  • Το COPY απλώς αντιγράφει αρχεία και καταλόγους από την καθορισμένη πηγή στη συγκεκριμένη τοποθεσία μέσα στο κοντέινερ. Η πηγή πρέπει να είναι ένα τοπικό αρχείο ή κατάλογος.
  • Το ADD έχει ευρύτερες δυνατότητες: μπορεί να αντιγράψει τοπικά αρχεία και καταλόγους, καθώς και να αποσυμπιέσει αρχεία (tar, gzip, bzip2) και να κατεβάσει αρχεία μέσω URL.

Βέλτιστες πρακτικές:

  1. Προτιμήστε το COPY αντί του ADD: Στις περισσότερες περιπτώσεις, το COPY είναι επαρκές. Είναι πιο διαφανές, καθώς απλώς αντιγράφει τοπικά αρχεία. Η χρήση του ADD για την αποσυμπίεση αρχείων ή τη λήψη μέσω URL μπορεί να είναι λιγότερο προβλέψιμη και να αυξήσει την πολυπλοκότητα της κατασκευής.

  2. Χρησιμοποιήστε το COPY για τοπικά αρχεία: Αν χρειάζεται να αντιγράψετε αρχεία από το πλαίσιο κατασκευής στην εικόνα, πάντα χρησιμοποιείτε το COPY.

    # Αντί για ADD . /app
    COPY . /app 
    
  3. Να είστε προσεκτικοί με τα 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
    
  4. Αποσυμπιέστε αρχεία σε ξεχωριστό στρώμα όταν χρησιμοποιείτε ADD: Αν πρέπει να χρησιμοποιήσετε το ADD για την αποσυμπίεση αρχείου (λιγότερο συνηθισμένο σενάριο), βεβαιωθείτε ότι το κάνετε σε ξεχωριστό στρώμα. Ωστόσο, όπως αναφέρθηκε προηγουμένως, η πιο συχνά προτιμώμενη πρακτική είναι η αποσυμπίεση με RUN.

  5. Αντιγράψτε μόνο τα απαραίτητα αρχεία: Μην αντιγράφετε ολόκληρο το πλαίσιο κατασκευής (COPY . /app) αν υπάρχουν περιττά αρχεία (πηγαίος κώδικας, δεδομένα δοκιμών, κρυφά directories κ.λπ.). Χρησιμοποιήστε το .dockerignore για να εξαιρέσετε αυτά τα αρχεία. Αυτό μειώνει το μέγεθος της εικόνας και επιταχύνει την κατασκευή, μειώνοντας τον όγκο δεδομένων που μεταφέρεται στον Docker daemon.

    Παράδειγμα .dockerignore:

    .git
    node_modules
    *.log
    tmp/
    
    # Αντιγράψτε μόνο τα απαραίτητα αρχεία μετά την εφαρμογή του `.dockerignore`
    COPY . /app
    
  6. Χρησιμοποιήστε απόλυτες διαδρομές για τον προορισμό: Πάντα καθορίζετε απόλυτη διαδρομή στον εικόνα (/app, /usr/local/bin κ.λπ.). Αυτό καθιστά το Dockerfile πιο κατανοητό και προβλέψιμο, αποφεύγοντας την αβεβαιότητα σχετικά με τον τρέχοντα εργασιακό κατάλογο (WORKDIR).

    # Πάντα καθορίζετε απόλυτη διαδρομή
    COPY src /app/src
    
  7. Μεταβάλλετε τη σειρά ανάλογα με τη συχνότητα αλλαγών: Τοποθετήστε τις εντολές 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.