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
.