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

Jaký je rozdíl mezi instrukcemi COPY a ADD v Dockerfile?

Jste v Dockeru nováčkem a učíte se vytvářet vlastní obrázky Dockeru pomocí Dockerfile.

Setkáte se s řadou instrukcí Dockerfile, jako je FROM, RUN atd.

Pak narazíte na COPY a ADD a uvědomíte si, že oba pokyny dělají stejnou práci; zkopírujte soubory a adresáře do upraveného obrazu Dockeru z hostitele.

Proč má Dockerfile dva příkazy pro stejnou úlohu? Je mezi nimi rozdíl? Vskutku. Mají podobné cíle, ale pokud jde o chování, liší se.

Dovolte mi, abych vám to vysvětlil.

Dockerfile ADD vs COPY

ADD i COPY jsou navrženy tak, aby přidávaly adresáře a soubory do vašeho obrazu Dockeru.

Instrukce ADD je relativně starší a dokáže více než jen kopírovat soubory a adresáře. ADD může stahovat soubory z externích adres URL. Dokáže také extrahovat komprimované soubory za předpokladu, že podporuje formát archivu. To také někdy způsobí problém, pokud ADD nemůže podporovat formát archivu.

Pokud to vše umí ADD, proč máme COPY? Je to proto, že příkazy Dockeru byly dosud několikrát restrukturalizovány. Důraz je kladen na poskytování jednoduché, přímočaré a efektivnější struktury příkazů.

COPY byla představena jako přímá náhrada za ADD. COPY pouze zkopíruje soubory a adresáře. A je to. Pro stahování a extrahování souborů se s instrukcemi RUN používají běžné linuxové příkazy jako curl a tar.

To je důvod, proč se v dnešní době doporučuje COPY a ADD najdete pouze ve starších tutoriálech a dokumentacích.

ADD je starší instrukce, která umí stahovat a extrahovat soubory kromě jejich kopírování do obrázků z hostitele. COPY může kopírovat pouze soubory a adresáře. V dnešní době se doporučuje kopírovat.

Podrobnější pohled na instrukce ADD

Instrukce ADD má následující tři možnosti:

1. Kopírování místních souborů do obrazu kontejneru

Řekněme například, pokud chcete zkopírovat místní soubory na hostitelském systému z /home/user/application do /opt/app na obrázku Dockeru můžete do souboru Dockerfile zahrnout následující instrukce:

ADD /home/user/application /opt/app

Zde pouze obsah /home/user/application adresář se zkopíruje do /opt/app včetně jeho metadat. Nebude kopírovat application samotný adresář.

2. Extrakce místně uložených souborů tar

Instrukci ADD můžete také použít k extrahování komprimovaných archivů s formáty - identita , gzip , bzip2 nebo xz . Obsah se rozbalí jako adresář v cílovém umístění vytvořeného obrazu Docker.

ADD /home/user/test.tar.gz /opt

Chování je podobné tomu, co se stane, když použijete příkaz tar k extrahování tarballu do konkrétního adresáře na vašem hostitelském systému.

3. Stáhnout soubor z adresy URL

Je to podobné jako wget -P funguje, ale pro Dockerfiles. Při vytváření bitové kopie Dockeru můžete pomocí následujících pokynů stáhnout soubor a uložit jej na požadované místo na obrázku kontejneru:

ADD https://filesamples.com/samples/document/pdf/sample2.pdf /home/user

Po vytvoření obrázku můžete mít tento dokument PDF předtím, než spustíte kontejner založený na něm. Toto je jeden z mnoha jedinečných případů použití.

Pokyn COPY

Instrukce COPY je evolucí instrukce ADD, která byla navržena tak, aby zmírnila zmatek mezi uživateli Dockeru. Jeho funkce je pouze jedna – kopírování souborů nebo adresářů ze zdrojového umístění na hostiteli do cílového umístění na obrázku Docker.

Takže je to v podstatě první bod v sekci ADD instrukce, o kterém jsme diskutovali výše. Odpovídající instrukce by byla:

COPY /home/user/application /opt/app

Jako osvědčený postup vývojáři v Docker oficiálně doporučují použít výše uvedené pokyny, aby nedošlo k záměně.

Pokud tedy chcete pouze kopírovat soubory nebo adresáře, měli byste použít pouze instrukci COPY. Snažte se nepoužívat ADD, kdekoli je to možné. Pro stahování a extrahování souborů použijte pokyny RUN s běžnými příkazy Linuxu.

Doufám, že nyní chápete základní rozdíl mezi těmito dvěma pokyny. Chcete-li jim porozumět jednotlivě, můžete se podívat na oficiální a úplné reference ADD a COPY.

Máte-li jakékoli návrhy, zpětnou vazbu nebo komentáře, které byste mohli sdílet ohledně výše uvedeného srovnání, zanechte prosím své myšlenky v sekci níže.


Docker
  1. Jaký je rozdíl mezi fsck a e2fsck?

  2. Jaký je rozdíl mezi ls a l?

  3. Jaký je rozdíl mezi `su -` a `su --login`?

  1. Jaký je rozdíl mezi InnoDB a MyISAM?

  2. Jaký je rozdíl mezi unlink a rm?

  3. Jaký je rozdíl mezi trasou a ip trasou?

  1. Jaký je rozdíl mezi cPanelem a WHM?

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

  3. Jaký je rozdíl mezi strtok_r a strtok_s v C?