Jaka jest różnica między poleceniami COPY
i ADD
w pliku Docker i kiedy miałbym używać jednego nad drugim?
COPY <src> <dest>
Instrukcja COPY skopiuje nowe pliki
<src>
i doda je do systemu plików kontenera pod ścieżką<dest>
ADD <src> <dest>
Instrukcja ADD skopiuje nowe pliki
<src>
i doda je do systemu plików kontenera pod ścieżką<dest>
.
docker
dockerfile
Steve
źródło
źródło
COPY
do wykonania przy każdym uruchomieniu, ponieważ niekoniecznie ma dostęp do oryginalnego kontekstu, aby pobrać zawartość.Odpowiedzi:
Powinieneś sprawdzić dokumentację
ADD
iCOPY
uzyskać bardziej szczegółowy opis ich zachowań, ale w skrócie, główną różnicą jest to, żeADD
można zrobić więcej niżCOPY
:ADD
pozwala<src>
być adresem URLADD
dokumentacja stwierdza, że:Zauważ, że najlepsze praktyki pisania Dockerfiles sugerują używanie
COPY
tam, gdzie magiaADD
nie jest wymagana. W przeciwnym razie możesz ( ponieważ musiałeś poszukać tej odpowiedzi ) pewnego dnia zdziwić się, gdy będziesz chciał skopiowaćkeep_this_archive_intact.tar.gz
do swojego kontenera, ale zamiast tego rozpylisz zawartość na swój system plików.źródło
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
Docker ADDCOPY
jestOdwołanie prosto z kodu źródłowego .
źródło
ADD
także nieistniejące katalogi . Tak więc, mimo że jest w jakiś sposób zniechęca całego tego wątku, ma przewagę nadCOPY
ponieważ nie trzeba uruchamiaćmkdir
i zaoszczędzić trochę pisanieIstnieje na ten temat oficjalna dokumentacja: Najlepsze praktyki pisania plików Docker
źródło
COPY
, ponieważ jest bardziej przejrzysty. Z pliku Docker Best Practices (2014-12-15):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Z dokumentów Docker:
Więcej: Najlepsze praktyki pisania Dockerfiles
źródło
Jeśli chcesz dodać plik xx.tar.gz do
/usr/local
kontenera, rozpakuj go, a następnie usuń niepotrzebny skompresowany pakiet.Do kopiowania:
Do dodania:
ADD obsługuje tylko lokalną ekstrakcję smoły. Poza tym COPY będzie używać trzech warstw, ale ADD używa tylko jednej warstwy.
źródło
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
kopiuje plik / katalog z twojego hosta na twój obraz.ADD
kopiuje plik / katalog z twojego hosta na obraz, ale może również pobierać zdalne adresy URL, wyodrębniać pliki TAR itp.Służy
COPY
do prostego kopiowania plików i / lub katalogów w kontekście kompilacji.Służy
ADD
do pobierania zdalnych zasobów, wypakowywania plików TAR itp.źródło
Z Docker docs: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
„Chociaż ADD i COPY są funkcjonalnie podobne, ogólnie rzecz biorąc, preferuje się COPY. Jest tak, ponieważ jest bardziej przejrzysty niż ADD. COPY obsługuje tylko podstawowe kopiowanie plików lokalnych do kontenera, podczas gdy ADD ma pewne funkcje (takie jak lokalne wyodrębnianie tar i zdalna obsługa adresów URL), które nie są od razu oczywiste. Dlatego najlepszym rozwiązaniem dla ADD jest lokalna ekstrakcja pliku tar do obrazu, tak jak w ADD rootfs.tar.xz /.
Jeśli masz wiele kroków Dockerfile, które używają innych plików z twojego kontekstu, KOPIUJ je indywidualnie, a nie wszystkie naraz. Zapewni to, że pamięć podręczna kompilacji każdego kroku zostanie unieważniona (wymuszając ponowne uruchomienie kroku), jeśli zmienią się specjalnie wymagane pliki.
Na przykład:
Powoduje mniej unieważnień pamięci podręcznej dla kroku RUN, niż jeśli umieścisz KOPIUJ. / tmp / przed nim.
Ponieważ rozmiar obrazu ma znaczenie, użycie 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ąć niepotrzebne pliki po ich wyodrębnieniu i nie będziesz musiał dodawać kolejnej warstwy na obrazie. Na przykład powinieneś unikać robienia takich rzeczy jak:
Zamiast tego zrób coś takiego:
W przypadku innych elementów (plików, katalogów), które nie wymagają funkcji automatycznego wyodrębniania tar ADD, należy zawsze używać funkcji KOPIUJ ”.
źródło
Źródło: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
źródło
Podczas tworzenia pliku Docker istnieją dwa polecenia, których można użyć do skopiowania do niego plików / katalogów -
ADD
iCOPY
. Chociaż istnieją niewielkie różnice w zakresie ich funkcji, zasadniczo wykonują to samo zadanie.Dlaczego więc mamy dwa polecenia i skąd wiemy, kiedy użyć jednego lub drugiego?
DOKER
ADD
POLECENIEZacznijmy od zauważenia, że
ADD
polecenie jest starsze niżCOPY
. Od momentu uruchomienia platformy Docker,ADD
instrukcja jest częścią listy poleceń.Polecenie kopiuje pliki / katalogi do systemu plików określonego kontenera.
Podstawowa składnia
ADD
polecenia to:Zawiera źródło, które chcesz skopiować (
<src>
), a następnie miejsce docelowe, w którym chcesz je zapisać (<dest>
). Jeśli źródłem jest katalog,ADD
skopiuj wszystko z niego (łącznie z metadanymi systemu plików).Na przykład, jeśli plik jest dostępny lokalnie i chcesz go dodać do katalogu obrazu, wpisz:
ADD
może również kopiować pliki z adresu URL. Może pobrać plik zewnętrzny i skopiować go do żądanego miejsca docelowego. Na przykład:Dodatkową funkcją jest to, że kopiuje skompresowane pliki, automatycznie wyodrębniając zawartość w danym miejscu docelowym. Ta funkcja dotyczy tylko lokalnie przechowywanych skompresowanych plików / katalogów.
Pamiętaj, że nie można pobrać i wyodrębnić skompresowanego pliku / katalogu z adresu URL. Polecenie nie rozpakowuje pakietów zewnętrznych podczas kopiowania ich do lokalnego systemu plików.
DOKER
COPY
POLECENIEZ powodu pewnych problemów z funkcjonalnością Docker musiał wprowadzić dodatkowe polecenie do powielania treści -
COPY
.W przeciwieństwie do ściśle powiązanego
ADD
polecenia,COPY
ma tylko jedną przypisaną funkcję. Jego rolą jest duplikowanie plików / katalogów w określonej lokalizacji w ich istniejącym formacie. Oznacza to, że nie zajmuje się wypakowywaniem skompresowanego pliku, a raczej kopiuje go takim, jakim jest.Z instrukcji można korzystać tylko w przypadku plików przechowywanych lokalnie. Dlatego nie można go używać z adresami URL do kopiowania plików zewnętrznych do kontenera.
Aby skorzystać z
COPY
instrukcji, postępuj zgodnie z podstawowym formatem poleceń:Wpisz źródło i miejsce, w którym polecenie ma wyodrębnić zawartość w następujący sposób:
Na przykład:
Którego polecenia użyć? (Najlepsza praktyka)
Biorąc pod uwagę okoliczności, w których
COPY
polecenie zostało wprowadzone, oczywiste jest, że dotrzymywanie goADD
było koniecznością. Docker opublikował oficjalny dokument opisujący najlepsze praktyki pisania Dockerfiles, który wyraźnie odradza korzystanie zADD
polecenia.Oficjalna dokumentacja Dockera wskazuje, że
COPY
powinna ona zawsze być instrukcją, ponieważ jest bardziej przejrzysta niżADD
.Jeśli chcesz skopiować z lokalnego kontekstu kompilacji do kontenera, trzymaj się
COPY
.Zespół dokerów zdecydowanie odradza również
ADD
pobieranie i kopiowanie pakietu z adresu URL. Zamiast tego bezpieczniej i wydajniej jest używać wget lub curl wRUN
poleceniu. W ten sposób unikasz tworzenia dodatkowej warstwy obrazu i oszczędzasz miejsce.źródło
Ważna uwaga
Musiałem
COPY
rozpakować pakiet Java na obrazie dokera. Kiedy porównałem rozmiar obrazu dokera utworzonego za pomocą ADD, był o 180 MB większy niż ten utworzony za pomocą COPY, tar -xzf * .tar.gz i rm * .tar.gzOznacza to, że chociaż ADD usuwa plik tar, nadal jest gdzieś przechowywany. I dzięki temu obraz jest większy !!
źródło
Ponieważ Docker 17.05
COPY
jest używany z--from
flagą w kompilacjach wieloetapowych do kopiowania artefaktów z poprzednich etapów kompilacji do bieżącego etapu kompilacji.z dokumentacji
źródło
To kolejny sposób kopiowania plików do obrazu. Opcja -v tymczasowo tworzy wolumin, którego użyliśmy podczas procesu kompilacji.
Różni się to od innych woluminów, ponieważ montuje katalog hosta tylko dla kompilacji. Pliki można skopiować za pomocą standardowej komendy cp.
Podobnie jak curl i wget, można go uruchomić na stosie poleceń (działa w jednym kontenerze) i nie pomnożyć rozmiaru obrazu. ADD i COPY nie można ustawiać jeden na drugim, ponieważ działają w autonomicznym kontenerze, a kolejne polecenia na plikach wykonywanych w dodatkowych kontenerach zwiększają rozmiar obrazu:
Po ustawieniu opcji w ten sposób:
W jednym kontenerze zostaną wykonane następujące czynności:
źródło
unknown shorthand flag: 'v' in -v