Sobes.tech
Middle

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:

  • COPY jednoduš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ář.
  • ADD má š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:

  1. Upřednostněte COPY před ADD: Ve většině případů je COPY dostačující. Je transparentnější, protože jednoduše kopíruje místní soubory. Použití ADD pro extrakci archivů nebo stahování přes URL může být méně předvídatelné a zvyšovat složitost sestavení.

  2. Používejte COPY pro místní soubory: Pokud potřebujete kopírovat soubory z kontextu sestavení do obrazu, vždy používejte COPY.

    # Místo `ADD` použijte . /app
    COPY . /app 
    
  3. Buďte opatrní s URL v ADD: Použití ADD s 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žívat curl nebo wget v 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
    
  4. Archivujte archivy v samostatném vrstvě při použití ADD: Pokud musíte použít ADD k 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.

  5. 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 .dockerignore k 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
    
  6. 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
    
  7. Měňte pořadí podle frekvence změn: Umístěte instrukce COPY nebo ADD pro soubory, které se mění méně často (například závislosti jako package.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ů.