Podczas tworzenia pliku Docker istnieją dwa polecenia, których można użyć do skopiowania do niego plików / katalogów - ADD
i COPY
. 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
POLECENIE
Zacznijmy 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:
ADD <src> … <dest>
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 /source/file/path /destination/path
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:
ADD http://source.file/url /destination/path
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.
ADD source.file.tar.gz /temp
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
POLECENIE
Z 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:
COPY <src> … <dest>
Na przykład:
COPY /source/file/path /destination/path
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 go ADD
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 w RUN
poleceniu. W ten sposób unikasz tworzenia dodatkowej warstwy obrazu i oszczędzasz miejsce.