Tworząc Dockerfile podstawową kwestią jest kopiowania plików, czy to kodu źródłowego aplikacji, czy plików konfiguracyjnych.
Zarówno poleceniem ADD jak i COPY można skopiować pliki/katalogi do określonej lokalizacji do Docker Image.
COPY
Polecenie COPY pozwala TYLKO na kopiowanie plików/katalogów do określonej lokalizacji wewnątrz Docker Image.
Składnia COPY jest następująca:
COPY [--chown=<user>:<group>] <src>... <dest>
Warto tutaj zwrócić uwagę na opcjonalny parametr --chown, służący do nadawania praw do kopiowanych plików/katalogów.
Domyślnie prawa do kopiowanych plików/katalogów ma użytkownik root.
Gdy użyjemy następującego polecenia:
COPY /source/file/path /destination/path
Prawa do /destination/path zostaną nadane użytkownikowi root.
Gdy chcemy nadać prawa np. użytkownikowi patrick, polecenie będzie następujące:
COPY --chown=patrick /source/file/path /destination/path
UWAGA: Funkcja --chown jest obsługiwana tylko do budowania kontenerów Linuxowych i nie działa w Windows Containers.
ADD
Polecenie ADD robi to samo co COPY, ale oprócz tego obsługuję dodatkowe przypadki.
Po pierwsze:
Możesz użyć adresu URL zamiast lokalnego pliku / katalogu.
ADD http://example.com/file.png /home
Po drugie:
Możesz wyodrębnić plik tar ze źródła bezpośrednio do miejsca docelowego.
ADD myfile.tar.gz /home/extracted_myfile
Pomimo, że kopiowanie bezpośrednio z URL za pomocą ADD jest możliwe, Docker zaleca by tego NIE ROBIĆ.
O ile to możliwe, unikaj korzystania z ADD, by nie być podatnym na ataki za pośrednictwem nieporządanych URL

Jeżeli chcesz poznać najlepsze praktyki tworzenia Dockerfile, zachęcam do lektury
“10 Najlepszych Praktyk Tworzenia Dockerfile”
Rekomendowanym podejściem jest użycie komendy RUN + curl/wget.
Przykładowo, zamiast
ADD http://example.com/big.tar.xz /usr/src/things/<br> RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things<br> RUN make -C /usr/src/things all
Należy użyć
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
Podsumowanie
Prawidłowym i rekomendowanym wykorzystaniem ADD jest przypadek, w którym chcemy rozpakować lokalne archiwum tar do określonego katalogu wewnątrz Docker Image. Praktycznie, ma to zastosowanie w oficjalnym obrazie alpine. ADD rootfs.tar.gz
Dla wszystkich przypadków gdzie nie wymagane jest automatyczne rozpakowanie pliku tar, należy używać polecenia COPY.

