Jaké jsou nejlepší postupy pro používání instrukcí ADD a COPY v Dockeru?
sobes.tech AI
Odpověď od AI
Existuje několik osvědčených postupů pro příkazy ADD a COPY v Dockeru, které jsou zaměřeny na zvýšení bezpečnosti, transparentnosti a efektivity při sestavování obrazů.
Hlavní rozdíl mezi ADD a COPY:
COPYjednoduše kopíruje soubory a adresáře ze zdroje uvedeného na hostiteli do cílového umístění v kontejneru. Zdroj musí být místní soubor nebo adresář.ADDmá širší možnosti: může kopírovat místní soubory a adresáře, stejně jako extrahovat archivy (tar, gzip, bzip2) a stahovat soubory přes URL.
Doporučené postupy:
-
Upřednostněte
COPYpředADD: Ve většině případů jeCOPYdostačující. Je transparentnější, protože jednoduše kopíruje místní soubory. PoužitíADDpro extrakci archivů nebo stahování přes URL může být méně předvídatelné a zvyšovat složitost sestavení. -
Používejte
COPYpro místní soubory: Pokud potřebujete kopírovat soubory z kontextu sestavení do obrazu, vždy používejteCOPY.# Místo `ADD` použijte . /app COPY . /app -
Buďte opatrní s URL v
ADD: PoužitíADDs URL může vést k nestabilitě sestavení, pokud vzdálený zdroj není dostupný. Také to může být méně bezpečné, protože závisíte na externím zdroji. Doporučuje se používatcurlnebowgetv samostatném vrstvě (RUN) pro stažení zdrojů přes URL, což dává větší kontrolu a umožňuje ověření kontrolního součtu.# Místo `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 -
Archivujte archivy v samostatném vrstvě při použití
ADD: Pokud musíte použítADDk extrakci archivu (méně běžný scénář), ujistěte se, že to děláte v samostatné vrstvě. Nicméně, jak bylo zmíněno dříve, často je výhodnější explicitně extrahovat pomocíRUN. -
Kopírujte pouze potřebné soubory: Nekopírujte celý kontext sestavení (
COPY . /app), pokud obsahuje zbytečné soubory (zdrojový kód, testovací data, skryté adresáře atd.). Použijte.dockerignorek vyloučení těchto souborů. To zkracuje velikost obrazu a urychluje sestavení tím, že snižuje množství dat přenášených na Docker daemon.Příklad
.dockerignore:.git node_modules *.log tmp/# Kopírujte pouze potřebné soubory po použití `.dockerignore` COPY . /app -
Používejte absolutní cesty pro určení cíle: Vždy uvádějte absolutní cestu v obraze (/app, /usr/local/bin atd.). To činí Dockerfile srozumitelnějším a předvídatelnějším, a vyhýbá se nejistotě ohledně aktuálního pracovního adresáře (
WORKDIR).# Vždy uvádějte absolutní cílovou cestu COPY src /app/src -
Měňte pořadí podle frekvence změn: Umístěte instrukce
COPYneboADDpro soubory, které se mění méně často (například závislosti jakopackage.json,requirements.txt), výše v Dockerfile, než instrukce pro soubory, které se mění častěji (například zdrojový kód aplikace). To umožňuje Docker efektivně využívat cache vrstev.# Soubory závislostí (mění se méně často) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Zdrojový kód aplikace (mění se častěji) COPY . /app/
Souhrnná tabulka:
| Instrukce | Popis | Doporučené použití | Čemu se vyhnout |
|---|---|---|---|
COPY |
Kopíruje místní soubory/katalogy | Kopírování místních souborů a katalogů do obrazu | Používejte pouze pokud není potřeba archivovat nebo stahovat přes URL |
ADD |
Kopíruje místní soubory/katalogy, extrahuje archivy, stahuje přes URL | Použití pro automatické extrahování archivů (zřídka) | Používejte pouze pro kopírování místních souborů (preferujte COPY). Použití pro stahování přes URL |
Dodržování těchto praktik povede k tvorbě spolehlivějších, bezpečnějších a efektivnějších Docker obrazů.