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

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 alpineADD rootfs.tar.gz

Dla wszystkich przypadków gdzie nie wymagane jest automatyczne rozpakowanie pliku tar, należy używać polecenia COPY.

Dołącz do newslettera

Już ponad 600 osób zapisało się na mój newsletter (zero spamu! - tylko informacje o nowych artykułach oraz ciekawe nowinki ze świata konteneryzacji).

Zapisując się, jako bonus prześlę Ci "21 Praktycznych Przykładów Użycia Dockera Dla Developerów" oraz zbiór "10 Najlepszych Praktyk Tworzenia Dockerfile"



Damian Naprawa

Praktykujący pasjonat konteneryzacji. Lubi dzielić się wiedzą prowadząc warszaty i szkolenia. Uczestnik globalnego programu Docker Enablement. Pracuje z Dockerem na codzień od kilku lat. Odpowiedzialny za tworzenie i utrzymanie systemów działających w oparciu o kontenery. Fan automatyzacji oraz podejścia "As a Code".

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *