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

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

ADD a COPY jsou dva podobné Dockerfile pokyny, které vám umožní přidat obsah k obrázkům v době sestavování. Zatímco COPY je přímočará kopie zdroje do cíle, ADD obsahuje další funkce pro práci s archivy a vzdálenými adresami URL.

KOPÍROVAT

COPY je jednodušší z obou pokynů. Přijímá dva argumenty, zdroj a cíl:

COPY example.txt /example/dir/example.txt

Zdrojová cesta bude zkopírována z vašeho hostitele Dockeru do souborového systému kontejneru. Vytvořený obraz bude obsahovat zkopírovaný soubor nebo adresář v zadané cílové cestě.

COPY funguje se všemi soubory a adresáři, ale zdrojové cesty jsou omezeny na ty v kontextu vašeho aktivního sestavení. Kontext se nastaví při spuštění docker build :

docker build .

# OR

docker build /path/to/context

Instrukce automaticky vytvoří cílový adresář v kontejneru, pokud ještě neexistuje. Pokud zahrnete koncové lomítko (/ ), Docker zachází s cílem jako s adresářem a umístí do něj zdrojový soubor.

Můžete použít zástupné znaky, například *.jpg ve zdrojové cestě, aby odpovídala sadě souborů. Tyto výrazy budou analyzovány pomocí Go filepath dohazovač.

Zkopírované soubory mají ve výchozím nastavení UID a GID 0. To lze upravit pomocí volitelného --chown příznak, který přijímá UID, GID a jména. Spouští chown na zkopírované soubory, jakmile jsou uvnitř kontejneru:

COPY --chown=my-user:my-group example.txt /example.txt

COPY také podporuje --from vlajka. Tím se zdrojová cesta upraví tak, aby odkazovala na jinou obrázek kontejneru, namísto vašeho místního kontextu sestavení. Funguje také s vícestupňovými sestaveními, aby vtáhl artefakty vytvořené v dřívějších fázích sestavení.

# Copies /usr/bin/composer from the composer:latest image
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Multi-stage build example
# Stage 1: Copies example.scss from working directory into node:latest image
# Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest)
FROM node:latest AS sass
COPY example.scss .
RUN npm install -g node-sass && node-sass example.scss example.css
FROM httpd:latest
COPY --from=sass /example.css example.css

--from příznak musí odkazovat na pojmenovanou fázi, která je uvedena dříve v Dockerfile . Pokud neexistuje žádná odpovídající fáze, Docker předpokládá, že místo toho odkazujete na obrázek. Pokud obrázek nelze stáhnout, dojde k chybě sestavení.

PŘIDAT

ADD má stejnou syntaxi jako COPY , přijímá zdrojové a cílové cesty. Neexistuje žádná podpora pro --from ale můžete použít --chown .

Na rozdíl od COPY , ADD je schopen stahovat adresy URL vzdálených souborů. Zadáním veřejně přístupné adresy URL jako zdrojové cesty se tento soubor stáhne a přidá do obrázku kontejneru. Upravený čas cílové cesty (mtime ) bude nastavena na hodnotu Last-Modified záhlaví v HTTP odpovědi stahování.

ADD může také extrahovat archivy tar, včetně archivů komprimovaných pomocí gzip, bzip2 a xz. Zadáním kompatibilního archivu jako zdrojové cesty se jeho obsah rozbalí do určeného adresáře kontejneru. Stávající obsah adresáře bude zachován.

Detekce archivu je založena na skutečném obsahu souboru, nikoli na názvu souboru nebo přípony. Můžete použít jakýkoli originální archivní soubor, aniž byste jej pojmenovali .tar , .tar.gz nebo .tar.xz .

Schopnost automaticky extrahovat archivy zjednodušuje přidávání softwarových balíčků distribuovaných jako soubory tar do obrázků kontejnerů. Dodání cesty tar do COPY by zkopíroval komprimovaný archivní soubor tak, jak je, nikoli jeho obsah. Budete muset použít RUN pokyn k ruční dekomprimaci souboru.

Chování kolem COPY použít pro ADD na. S výjimkou vzdálených adres URL musí v kontextu vašeho sestavení existovat zdrojové cesty. Cílová cesta kontejneru bude automaticky vytvořena, pokud neexistuje pomocí Dockerových pravidel pro rozlišení cesty.

Přehled

COPY a ADD jsou dvě úzce související, ale výrazně odlišné instrukce, které můžete použít při psaní Dockerfile . Protože se jejich sady funkcí překrývají, možná vás zajímá, která je „nejlepší“ pro použití ve výchozím nastavení.

Podle vlastní příručky osvědčených postupů společnosti Docker byste měli sáhnout po COPY pokud nepotřebujete další možnosti ADD . ADD je neprůhledná operace, která přidává kouzlo do procesu kopírování.

Pouze pomocí ADD když je to skutečně potřeba, pomáhá sdělit vaše záměry. Jinak riskujete, že si členové týmu zvyknou používat ADD což by mohlo mít katastrofální následky. Neúmyslné ADD my-archive.tar . místo COPY my-archive.tar může způsobit zmatek a nefunkční sestavení, když se obsah archivu zobrazí ve vašem kontejneru namísto samotného archivu.

Měli byste také pečlivě zvážit, kdy je vhodné použít ADD se vzdálenými URL. Může být efektivnější použít curl nebo wget s RUN instrukce, protože to pomáhá usnadnit ukládání obrazové vrstvy do mezipaměti. ADD instrukce vždy zruší platnost mezipaměti pro všechny následující fáze sestavení, když se soubor na vzdálené adrese URL změní.

Je-li to možné, je dobré zkopírované soubory po použití smazat. Pokud stahujete nebo extrahujete instalační program softwaru, smazání jednorázového binárního souboru po jeho spuštění pomůže zeštíhlit váš konečný obrázek.


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

  2. Jaký je rozdíl mezi adduser a useradd?

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

  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Jaký je rozdíl mezi $(CC) a $CC?

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

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

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

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