Jaka jest różnica między poleceniami "Kopiuj" i "dodaj" w pliku Dokerowym?

Jaka jest różnica między poleceniami COPY i ADD w pliku Dockerfile i kiedy miałbym użyć jednego nad drugim?


COPY <src> <dest>

Instrukcja COPY skopiuje nowe pliki z <src> i doda je do system plików kontenera na ścieżce <dest>


ADD <src> <dest>

Instrukcja ADD skopiuje nowe pliki z <src> i doda je do system plików kontenera w path <dest>.

Author: sk8forether, 2014-07-25

10 answers

Powinieneś sprawdzić ADD oraz COPY dokumentacja do wyczerpującego opisu ich zachowań, ale w skrócie główną różnicą jest to, że ADD może zrobić więcej niż COPY:

  • ADD pozwala <src> BYĆ adresem URL
  • Jeśli parametr <src> z ADD jest archiwum w uznanym formacie kompresji, zostanie rozpakowany

Zauważ, że najlepsze praktyki pisania plików Dockerfiles sugerują użycie COPY gdzie magia z dnia ADD nie jest wymagane. W przeciwnym razie (ponieważ musiałeś wyszukać tę odpowiedź) prawdopodobnie pewnego dnia będziesz zaskoczony, gdy zamierzasz skopiować keep_this_archive_intact.tar.gz do kontenera, ale zamiast tego spryskasz zawartość na swój system plików.

 1568
Author: icecrime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 16:34:47

COPY is

To samo co 'ADD' , ale bez tar i zdalnej obsługi URL.

Odniesienie prosto z kodu źródłowego .

 310
Author: caike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 17:00:46

Istnieje oficjalna dokumentacja na ten temat: Najlepsze praktyki pisania plików Dockerfiles

Ponieważ rozmiar obrazu ma znaczenie, używanie ADD do pobierania pakietów ze zdalnych adresów URL jest zdecydowanie odradzane; zamiast tego powinieneś użyć curl lub wget. W ten sposób możesz usunąć Pliki, których już nie potrzebujesz po ich wyodrębnieniu i nie musisz dodawać kolejnej warstwy do obrazu.

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

Dla innych elementów (plików, katalogów), które nie wymagają ADD's tar auto-ekstrakcji możliwości, należy zawsze używać COPY.

 116
Author: Victor Laskin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 00:35:18

From Docker docs:

Dodaj lub skopiuj

Chociaż dodawanie i kopiowanie są funkcjonalnie podobne, ogólnie rzecz biorąc, kopiowanie jest preferowane. To dlatego, że jest bardziej przejrzysty niż dodać. COPY obsługuje tylko podstawowe kopiowanie plików lokalnych do kontenera, podczas gdy ADD ma pewne funkcje (takie jak lokalna ekstrakcja tar i zdalna obsługa URL), które nie są od razu oczywiste. W związku z tym najlepszym zastosowaniem ADD jest lokalne automatyczne wyodrębnianie pliku tar do obrazu, tak jak w ADD rootfs.smoła.xz /

Więcej: najlepsze praktyki pisania plików Dockerfiles

 95
Author: eddd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 00:35:53

Jeśli chcesz dodać xx. tar.gz do /usr/local w kontenerze, rozpakuj go, a następnie usuń bezużyteczny skompresowany pakiet.

Dla kopii:

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

Dla dodania:

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

Dodaj obsługuje tylko lokalne ekstrakcje smoły. Poza tym COPY użyje trzech warstw, ale ADD używa tylko jednej warstwy.

 27
Author: BertLi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 18:40:35

Z Docker docs: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"chociaż dodawanie i kopiowanie są funkcjonalnie podobne, ogólnie rzecz biorąc, kopiowanie jest preferowane. To dlatego, że jest bardziej przejrzysty niż dodać. COPY obsługuje tylko podstawowe kopiowanie plików lokalnych do kontenera, podczas gdy ADD ma pewne funkcje (takie jak lokalna ekstrakcja tar i zdalna obsługa URL), które nie są od razu oczywiste. W związku z tym najlepszym zastosowaniem ADD jest local tar file auto-extraction into the image, as in ADD rootfs.smoła.xz /

Jeśli masz wiele kroków Dockerfile, które używają różnych plików z twojego kontekstu, skopiuj je pojedynczo, a nie wszystkie naraz. Zapewni to, że pamięć podręczna każdego kroku zostanie unieważniona (zmuszając krok do ponownego uruchomienia), jeśli zmienią się specjalnie wymagane pliki.

Na przykład:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Powoduje mniej unieważnień pamięci podręcznej dla kroku uruchamiania, niż w przypadku umieszczenia kopii . / tmp / before to.

Ponieważ rozmiar obrazu ma znaczenie, używanie ADD do pobierania pakietów ze zdalnych adresów URL jest zdecydowanie odradzane. W ten sposób możesz usunąć Pliki, których już nie potrzebujesz po ich wyodrębnieniu i nie musisz dodawać kolejnej warstwy do obrazu. Na przykład, powinieneś unikać takich rzeczy jak:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

A zamiast tego zrób coś w stylu:

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

Dla innych elementów (plików, katalogów), które nie wymagają możliwości automatycznego ekstrakcji TAR ADD, zawsze powinieneś używać kopii."

 11
Author: jhpg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 14:33:41

COPY kopiuje plik / katalog z hosta do obrazu.

ADD kopiuje plik / katalog z hosta do obrazu, ale może również pobierać zdalne adresy URL, wyodrębniać pliki TAR itp...

Użycie COPY do prostego kopiowania plików i / lub katalogów w kontekście budowania.

Użycie ADD do pobierania zdalnych zasobów, wyodrębniania plików TAR itp..

 2
Author: JSON C11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 12:11:18

COPY I ADD to instrukcje Dockerfile, które służą do podobnych celów. Umożliwiają kopiowanie plików z określonej lokalizacji do obrazu dokera.

Kopia przyjmuje src i miejsce docelowe. Pozwala tylko na skopiowanie lokalnego pliku lub katalogu z hosta (maszyny budującej Obraz dokera) do samego obrazu dokera.

ADD pozwala ci to zrobić, ale obsługuje również 2 inne źródła. Po pierwsze, możesz użyć adresu URL zamiast lokalnego pliku / katalogu. Po drugie, można wyodrębnić plik tar ze źródła bezpośrednio do miejsca docelowego

Poprawnym przypadkiem użycia ADD jest rozpakowanie lokalnego pliku tar do określonego katalogu w obrazie dokera.

Jeśli kopiujesz pliki lokalne do obrazu dokera, Zawsze używaj opcji Kopiuj, ponieważ jest ona bardziej wyraźna.

Odniesienie : https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile

 0
Author: Shagun Pruthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 07:10:51

Ważna Uwaga

Musiałem COPY i rozpakować pakiet Javy w obrazie Dockera. Kiedy porównałem Rozmiar obrazu Dockera utworzonego za pomocą ADD, był on o 180MB większy niż ten utworzony za pomocą kopiowania, tar-xzf*.smoła.gz i rm *.smoła.gz

Oznacza to, że chociaż ADD usuwa plik tar, nadal jest on gdzieś przechowywany. A to sprawia, że obraz jest większy!!

 0
Author: Avi Veltz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 07:23:39
docker build -t {image name} -v {host directory}:{temp build directory} .

Jest to inny sposób kopiowania plików do obrazu. Opcja-v tymczasowo tworzy wolumin, którego użyliśmy podczas procesu budowania.

To jest INNE niż inne woluminy, ponieważ montuje katalog hosta tylko dla kompilacji. Pliki można kopiować za pomocą standardowego polecenia cp.

Również, podobnie jak curl i wget, może być uruchamiany w stosie poleceń (działa w jednym kontenerze) i nie mnożyć rozmiaru obrazu. Dodawanie i kopiowanie nie są układane w stos, ponieważ działają w samodzielny kontener i kolejne polecenia na tych plikach, które wykonują się w dodatkowych kontenerach, pomnoży Rozmiar obrazu:

Z opcjami ustawionymi tak:

-v /opt/mysql-staging:/tvol

W jednym kontenerze wykonamy:

RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
    mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \

    mkdir /u1/mysql/mysql-files && \
    mkdir /u1/mysql/innodb && \
    mkdir /u1/mysql/innodb/libdata && \
    mkdir /u1/mysql/innodb/innologs && \
    mkdir /u1/mysql/tmp && \

    chmod 750 /u1/mysql/mysql-files && \
    chown -R mysql /u1/mysql && \
    chgrp -R mysql /u1/mysql
 -1
Author: Dennis Payne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 21:25:28