Ú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