Jakie są najlepsze praktyki korzystania z instrukcji ADD i COPY w Dockerze?
sobes.tech AI
Odpowiedź od AI
Istnieje kilka najlepszych praktyk dla instrukcji ADD i COPY w Dockerze, mających na celu zwiększenie bezpieczeństwa, przejrzystości i wydajności podczas tworzenia obrazów.
Główna różnica między ADD a COPY:
COPYpo prostu kopiuje pliki i katalogi z określonego źródła na hoście do miejsca docelowego w kontenerze. Źródło musi być plikiem lub katalogiem lokalnym.ADDma szersze możliwości: może kopiować lokalne pliki i katalogi, a także wyodrębniać archiwa (tar, gzip, bzip2) i pobierać pliki z URL.
Najlepsze praktyki:
-
Preferuj
COPYzamiastADD: W większości przypadkówCOPYjest wystarczające. Jest bardziej przejrzyste, ponieważ po prostu kopiuje lokalne pliki. UżycieADDdo wyodrębniania archiwów lub pobierania z URL może być mniej przewidywalne i zwiększać złożoność procesu budowania. -
Używaj
COPYdla lokalnych plików: Jeśli musisz skopiować pliki z kontekstu budowania do obrazu, zawsze używajCOPY.# Zamiast ADD . /app COPY . /app -
Uważaj na URL w
ADD: UżycieADDz URL może prowadzić do niestabilności podczas budowania, jeśli zdalny zasób nie jest dostępny. Ponadto, może być mniej bezpieczne, ponieważ zależy od zewnętrznego źródła. Zaleca się używaniecurllubwgetw osobnej warstwie (RUN) do pobierania zasobów z URL, co daje większą kontrolę i umożliwia sprawdzenie sumy kontrolnej.# Zamiast ADD http://example.com/file.tar.gz /tmp/ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \ && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \ && tar -xzf /tmp/file.tar.gz -C /app \ && rm /tmp/file.tar.gz -
Wyodrębniaj archiwa w osobnej warstwie przy użyciu
ADD: Jeśli musisz używaćADDdo wyodrębniania archiwów (mniej powszechne), upewnij się, że robisz to w osobnej warstwie. Jednak, jak wspomniano wcześniej, zazwyczaj lepiej jest wyodrębnić je explicite za pomocąRUN. -
Kopiuj tylko potrzebne pliki: Nie kopiuj całego kontekstu budowania (
COPY . /app), jeśli zawiera niepotrzebne pliki (kod źródłowy, dane testowe, ukryte katalogi itp.). Użyj.dockerignore, aby wykluczyć te pliki. To zmniejsza rozmiar obrazu i przyspiesza budowanie poprzez zmniejszenie ilości danych przesyłanych do demona Dockera.Przykład
.dockerignore:.git node_modules *.log tmp/# Kopiuj tylko potrzebne pliki po zastosowaniu `.dockerignore` COPY . /app -
Używaj absolutnych ścieżek dla celów: Zawsze podawaj absolutne ścieżki docelowe w obrazie (/app, /usr/local/bin itp.). To sprawia, że Dockerfile jest bardziej czytelny i przewidywalny, unikając niepewności co do bieżącego katalogu roboczego (
WORKDIR).# Zawsze używaj absolutnych ścieżek docelowych COPY src /app/src -
Różnicuj kolejność w zależności od częstotliwości zmian: Umieszczaj instrukcje
COPYlubADDdla plików, które zmieniają się rzadziej (np. pliki zależności, takie jakpackage.json,requirements.txt), wyżej w Dockerfile, a te dla plików, które zmieniają się częściej (kod źródłowy aplikacji), niżej. To pozwala Dockerowi efektywnie korzystać z pamięci podręcznej warstw.# Pliki zależności (zmieniają się rzadziej) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Kod źródłowy aplikacji (zmienia się częściej) COPY . /app/
Podsumowując:
| Instrukcja | Opis | Zalecane użycie | Czego unikać |
|---|---|---|---|
COPY |
Kopiuje lokalne pliki/directory | Kopiowanie lokalnych plików i katalogów do obrazu. | Używaj, jeśli potrzebujesz wyodrębniać archiwa lub pobierać z URL. |
ADD |
Kopiuje lokalne pliki/directory, wyodrębnia archiwa, pobiera z URL | Użycie do automatycznego wyodrębniania archiwów (rzadkie). | Używaj do kopiowania lokalnych plików (preferuj COPY). Użyj do pobierania z URL. |
Przestrzeganie tych praktyk prowadzi do tworzenia bardziej niezawodnych, bezpiecznych i wydajnych obrazów Docker.