Sobes.tech
Middle

Care sunt cele mai bune practici pentru utilizarea instrucțiunilor ADD și COPY în Docker?

sobes.tech AI

Răspuns de la AI

Există mai multe practici recomandate pentru instrucțiunile ADD și COPY în Docker, menite să crească securitatea, transparența și eficiența construirii imaginilor.

Diferența principală între ADD și COPY:

  • COPY copiază simplu fișierele și directoarele din sursa specificată pe gazdă în destinația specificată în container. Sursa trebuie să fie un fișier sau director local.
  • ADD are capacități mai largi: poate copia fișiere și directoare locale, precum și extrage arhive (tar, gzip, bzip2) și poate descărca fișiere de pe URL.

Practici recomandate:

  1. Preferă COPY în loc de ADD: În cele mai multe cazuri, COPY este suficient. Este mai transparent, deoarece copiază pur și simplu fișiere locale. Utilizarea ADD pentru extragerea arhivelor sau descărcarea de pe URL poate fi mai puțin previzibilă și poate complica construcția.

  2. Folosește COPY pentru fișierele locale: Dacă trebuie să copiezi fișiere din contextul de construcție în imagine, folosește întotdeauna COPY.

    # În loc de ADD . /app
    COPY . /app 
    
  3. Fii atent la URL-urile din ADD: Utilizarea ADD cu URL poate duce la instabilitatea construcției dacă resursa de la distanță nu este disponibilă. De asemenea, poate fi mai puțin sigur, deoarece depinzi de o sursă externă. Este recomandat să folosești curl sau wget într-un strat separat (RUN) pentru a descărca resursele de pe URL, oferind mai mult control și posibilitatea verificării sumelor de control.

    # În loc de 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. Extrage arhivele într-un strat separat când folosești ADD: Dacă trebuie să folosești ADD pentru extragerea unui arhiv (scenariu mai rar), asigură-te că faci acest lucru într-un strat separat. Totuși, cum s-a menționat anterior, de cele mai multe ori, extragerea explicită cu RUN este preferabilă.

  5. Copiază doar fișierele necesare: Nu copia întregul context de construcție (COPY . /app) dacă există fișiere inutile (cod sursă, date de test, directoare ascunse etc.). Folosește .dockerignore pentru a exclude aceste fișiere. Acest lucru reduce dimensiunea imaginii și accelerează construcția prin reducerea datelor transferate către daemon-ul Docker.

    Exemplu .dockerignore:

    .git
    node_modules
    *.log
    tmp/
    
    # Copiază doar fișierele necesare după aplicarea `.dockerignore`
    COPY . /app
    
  6. Folosește căi absolute pentru destinație: Specifică întotdeauna o cale absolută pentru destinație în imagine (/app, /usr/local/bin etc.). Acest lucru face Dockerfile-ul mai clar și previzibil, evitând incertitudinea legată de directorul de lucru curent (WORKDIR).

    # Specifică întotdeauna o cale absolută
    COPY src /app/src
    
  7. Variază ordinea în funcție de frecvența modificărilor: Plasează instrucțiunile COPY sau ADD pentru fișierele care se schimbă mai rar (de exemplu, fișierele de dependințe precum package.json, requirements.txt) mai sus în Dockerfile decât cele pentru fișierele care se schimbă frecvent (codul sursă al aplicației). Acest lucru permite Docker să utilizeze eficient cache-ul straturilor.

    # Fișiere de dependințe (se schimbă mai rar)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Codul sursă al aplicației (se schimbă mai frecvent)
    COPY . /app/ 
    

Sumar tabel:

Instrucțiune Descriere Utilizare recomandată Ce să eviți
COPY Copiază fișiere/directoare locale Copierea fișierelor și directoarelor locale în imagine. Utilizarea dacă trebuie să extragi arhive sau să descarci de pe URL.
ADD Copiază fișiere/directoare locale, extrage arhive, descarcă de pe URL Utilizare pentru extragerea automată a arhivelor (rar). Utilizare pentru copierea fișierelor locale (preferă COPY). Utilizare pentru descărcare de pe URL.

Respectarea acestor practici duce la crearea de imagini Docker mai fiabile, mai sigure și mai eficiente.