Sobes.tech
Middle

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:

  • COPY po 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.
  • ADD ma 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:

  1. Preferuj COPY zamiast ADD: W większości przypadków COPY jest wystarczające. Jest bardziej przejrzyste, ponieważ po prostu kopiuje lokalne pliki. Użycie ADD do wyodrębniania archiwów lub pobierania z URL może być mniej przewidywalne i zwiększać złożoność procesu budowania.

  2. Używaj COPY dla lokalnych plików: Jeśli musisz skopiować pliki z kontekstu budowania do obrazu, zawsze używaj COPY.

    # Zamiast ADD . /app
    COPY . /app 
    
  3. Uważaj na URL w ADD: Użycie ADD z 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żywanie curl lub wget w 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
    
  4. Wyodrębniaj archiwa w osobnej warstwie przy użyciu ADD: Jeśli musisz używać ADD do 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.

  5. 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
    
  6. 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
    
  7. Różnicuj kolejność w zależności od częstotliwości zmian: Umieszczaj instrukcje COPY lub ADD dla plików, które zmieniają się rzadziej (np. pliki zależności, takie jak package.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.