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:
COPYcopiază 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.ADDare 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:
-
Preferă
COPYîn loc deADD: În cele mai multe cazuri,COPYeste suficient. Este mai transparent, deoarece copiază pur și simplu fișiere locale. UtilizareaADDpentru extragerea arhivelor sau descărcarea de pe URL poate fi mai puțin previzibilă și poate complica construcția. -
Folosește
COPYpentru fișierele locale: Dacă trebuie să copiezi fișiere din contextul de construcție în imagine, folosește întotdeaunaCOPY.# În loc de ADD . /app COPY . /app -
Fii atent la URL-urile din
ADD: UtilizareaADDcu 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șticurlsauwgetî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 -
Extrage arhivele într-un strat separat când folosești
ADD: Dacă trebuie să foloseștiADDpentru 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ă cuRUNeste preferabilă. -
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.dockerignorepentru 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 -
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 -
Variază ordinea în funcție de frecvența modificărilor: Plasează instrucțiunile
COPYsauADDpentru fișierele care se schimbă mai rar (de exemplu, fișierele de dependințe precumpackage.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.