Sobes.tech
Middle

Aké sú najlepšie praktiky pre používanie inštrukcií ADD a COPY v Docker?

sobes.tech AI

Odpoveď od AI

Pre inštrukcie ADD a COPY v Docker existuje niekoľko najlepších praktík zameraných na zvýšenie bezpečnosti, transparentnosti a efektívnosti zostavovania obrazov.

Hlavný rozdiel medzi ADD a COPY:

  • COPY jednoducho kopíruje súbory a adresáre zo zdroja na hostiteľovi do cieľového miesta v kontajneri. Zdroj musí byť lokálnym súborom alebo adresárom.
  • ADD má širšie možnosti: môže kopírovať lokálne súbory a adresáre, ako aj extrahovať archívy (tar, gzip, bzip2) a sťahovať súbory z URL.

Najlepšie praktiky:

  1. Uprednostnite COPY pred ADD: Vo väčšine prípadov je dostatočný COPY. Je transparentnejší, pretože jednoducho kopíruje lokálne súbory. Použitie ADD na extrakciu archívov alebo sťahovanie z URL môže byť menej predvídateľné a zvyšovať zložitosť zostavovania.

  2. Používajte COPY pre lokálne súbory: Ak potrebujete skopírovať súbory zo zostavovacieho kontextu do obrazu, vždy používajte COPY.

    # Namiesto ADD . /app
    COPY . /app 
    
  3. Buďte opatrní s URL v ADD: Použitie ADD s URL môže viesť k nestabilite zostavovania, ak je vzdialený zdroj nedostupný. Taktiež to môže byť menej bezpečné, pretože závisíte od externého zdroja. Odporúča sa použiť curl alebo wget v samostatnom vrstvu (RUN) na stiahnutie zdrojov z URL, čo poskytuje väčšiu kontrolu a umožňuje overenie kontrolného súčtu.

    # Namiesto 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. Extrahujte archívy v samostatnej vrstve pri použití ADD: Ak musíte použiť ADD na extrakciu archívu (menej bežný scenár), uistite sa, že to robíte v samostatnej vrstve. Avšak, ako bolo spomenuté skôr, často je jasnejšie použiť RUN na extrakciu.

  5. Kopírujte len potrebné súbory: Nekopírujte celý zostavovací kontext (COPY . /app), ak obsahuje nepotrebné súbory (zdrojový kód, testovacie dáta, skryté adresáre a pod.). Použite .dockerignore na vylúčenie týchto súborov. To znižuje veľkosť obrazu a zrýchľuje zostavovanie znížením množstva dát prenášaných Docker démonom.

    Príklad .dockerignore:

    .git
    node_modules
    *.log
    tmp/
    
    # Skopírujeme len potrebné súbory po použití `.dockerignore`
    COPY . /app
    
  6. Používajte absolútne cesty na určenie cieľa: Vždy uvádzajte absolútnu cestu cieľa v obraze (/app, /usr/local/bin a pod.). To robí Dockerfile zrozumiteľnejším a predvídateľnejším, vyhýbajúc sa nejasnostiam ohľadom aktuálneho pracovného adresára (WORKDIR).

    # Vždy uvádzajte absolútnu cestu cieľa
    COPY src /app/src
    
  7. Variajte poradie v závislosti od frekvencie zmien: Umiestnite inštrukcie COPY alebo ADD pre súbory, ktoré sa menia menej často (napríklad závislosti ako package.json, requirements.txt), vyššie v Dockerfile, ako inštrukcie pre súbory, ktoré sa menia častejšie (zdrojový kód aplikácie). To umožňuje Docker efektívne využívať cache vrstiev.

    # Súbory závislostí (menia sa menej často)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Zdrojový kód aplikácie (mení sa častejšie)
    COPY . /app/ 
    

Prehľadná tabuľka:

Inštrukcia Popis Odporúčané použitie Čo sa má vyhnúť
COPY Kopíruje lokálne súbory/adresáre Kopírovanie lokálnych súborov a adresárov do obrazu. Používajte, ak nie je potrebné extrahovať archívy alebo sťahovať z URL.
ADD Kopíruje lokálne súbory/adresáre, extrahuje archívy, sťahuje z URL Používajte na automatickú extrakciu archívov (zriedkavo). Používajte na kopírovanie lokálnych súborov (preferujte COPY). Používajte na sťahovanie z URL.

Dodržiavanie týchto praktík vedie k tvorbe spoľahlivejších, bezpečnejších a efektívnejších Docker obrazov.