GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Docker ADD vs. COPY:Jaké jsou rozdíly?

Úvod

Při vytváření souboru Dockerfile existují dva příkazy, které do něj můžete zkopírovat soubory/adresáře – ADD a COPY . I když existují drobné rozdíly v rozsahu jejich funkce, plní v podstatě stejný úkol.

Proč tedy máme dva příkazy a jak víme, kdy použít jeden nebo druhý?

V tomto článku vysvětlíme každý příkaz, analyzujeme Docker ADD vs. COPY a řekneme vám, který z nich použít.

Příkaz ADD Docker

Začněme tím, že ADD příkaz je starší než COPY . Od spuštění platformy Docker ADD instrukce byla součástí jeho seznamu příkazů.

Příkaz zkopíruje soubory/adresáře do souborového systému zadaného kontejneru.

Základní syntaxe pro ADD příkaz je:

ADD <src> … <dest>

Obsahuje zdroj, který chcete zkopírovat (<src> ) a za ním cíl, kam jej chcete uložit (<dest> ). Pokud je zdrojem adresář, ADD zkopíruje vše, co je v něm (včetně metadat systému souborů).

Pokud je například soubor lokálně dostupný a chcete jej přidat do adresáře obrázku, zadejte:

ADD /source/file/path  /destination/path

ADD může také kopírovat soubory z adresy URL. Může stáhnout externí soubor a zkopírovat jej do požadovaného cíle. Například:

ADD http://source.file/url  /destination/path

Další funkcí je, že kopíruje komprimované soubory a automaticky extrahuje obsah v daném cíli. Tato funkce se vztahuje pouze na lokálně uložené komprimované soubory/adresáře.

Zadejte zdroj a místo, kam má příkaz extrahovat obsah, následovně:

ADD source.file.tar.gz /temp

Mějte na paměti, že nemůžete stáhnout a extrahovat komprimovaný soubor/adresář z adresy URL. Příkaz nerozbalí externí balíčky při jejich kopírování do místního souborového systému.

Příkaz Docker Copy

Kvůli některým funkčním problémům musel Docker zavést další příkaz pro duplikování obsahu – COPY .

Na rozdíl od úzce souvisejícího ADD příkaz COPY má pouze jednu přiřazenou funkci. Jeho úlohou je duplikovat soubory/adresáře na určeném místě v jejich stávajícím formátu. To znamená, že se nezabývá extrahováním komprimovaného souboru, ale kopíruje jej tak, jak je.

Instrukci lze použít pouze pro lokálně uložené soubory. Proto jej nemůžete použít s adresami URL ke kopírování externích souborů do vašeho kontejneru.

Chcete-li použít COPY postupujte podle základního formátu příkazu:

COPY <src> … <dest> 

Například:

COPY /source/file/path  /destination/path 

Docker Copy vs ADD

Proč bylo potřeba přidat nový, podobný příkaz?

Skutečnost, že ADD tolik funkcí se v praxi ukázalo jako problematické, protože se choval extrémně nepředvídatelně. Výsledkem takového nespolehlivého výkonu často bylo kopírování, když jste chtěli extrahovat, a extrahování, když jste chtěli kopírovat.

Docker nemohl úplně nahradit příkaz kvůli mnoha existujícím způsobům použití. Aby se předešlo zpětné kompatibilitě, bylo nejbezpečnější možností přidat COPY příkaz – méně rozmanitý, ale spolehlivější příkaz.

Které použít (doporučené postupy)

S ohledem na okolnosti, za kterých COPY byl zaveden příkaz, je evidentní, že zachování ADD bylo nutností. Společnost Docker vydala oficiální dokument popisující osvědčené postupy pro psaní souborů Dockerfiles, který výslovně nedoporučuje používat ADD příkaz .

Oficiální dokumentace Dockeru uvádí, že COPY by měla být vždy hlavní instrukce, protože je transparentnější než ADD .

Pokud potřebujete zkopírovat z místního kontextu sestavení do kontejneru, použijte COPY .

Tým Docker také důrazně nedoporučuje používat ADD stáhnout a zkopírovat balíček z adresy URL. Místo toho je bezpečnější a efektivnější používat wget nebo vlnit v rámci RUN příkaz. Vyhnete se tak vytváření další vrstvy obrazu a ušetříte místo.

Řekněme, že si chcete stáhnout komprimovaný balíček z adresy URL, extrahovat obsah a vyčistit archiv.

Místo použití ADD a spuštěním následujícího příkazu:

ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
  && make -C /tmp/package.file \
  && rm /tmp/ package.file.tar.gz

Měli byste použít:

RUN curl http://source.file/package.file.tar.gz \
  | tar -xjC /tmp/ package.file.tar.gz \
  && make -C /tmp/ package.file.tar.gz

Docker
  1. Jaké jsou rozdíly mezi jádrem dodávaným Ubuntu a upstream jádrem?

  2. Jaký je rozdíl mezi COPY a ADD v Dockerfiles?

  3. Jak aktualizovat/přidat soubor v Docker Image

  1. MySQL vs. MariaDB:Jaké jsou hlavní rozdíly mezi nimi

  2. Debian vs Ubuntu:Jaké jsou rozdíly?

  3. 7zip, Xz, Gzip, Tar, atd. – Jaké jsou rozdíly?

  1. Jaké jsou rozdíly mezi grep, awk a sed?

  2. Jaké jsou rozdíly mezi lsof a netstat na linuxu?

  3. Jaké jsou rozdíly mezi rdesktop a xfreerdp?