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:
COPYjednoducho 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.ADDmá š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:
-
Uprednostnite
COPYpredADD: Vo väčšine prípadov je dostatočnýCOPY. Je transparentnejší, pretože jednoducho kopíruje lokálne súbory. PoužitieADDna extrakciu archívov alebo sťahovanie z URL môže byť menej predvídateľné a zvyšovať zložitosť zostavovania. -
Používajte
COPYpre lokálne súbory: Ak potrebujete skopírovať súbory zo zostavovacieho kontextu do obrazu, vždy používajteCOPY.# Namiesto ADD . /app COPY . /app -
Buďte opatrní s URL v
ADD: PoužitieADDs 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ťcurlalebowgetv 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 -
Extrahujte archívy v samostatnej vrstve pri použití
ADD: Ak musíte použiťADDna 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ťRUNna extrakciu. -
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.dockerignorena 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 -
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 -
Variajte poradie v závislosti od frekvencie zmien: Umiestnite inštrukcie
COPYaleboADDpre súbory, ktoré sa menia menej často (napríklad závislosti akopackage.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.