Sobes.tech
Middle

Was sind die besten Praktiken für die Verwendung der Anweisungen ADD und COPY in Docker?

sobes.tech KI

Antwort von AI

Es gibt mehrere bewährte Praktiken für die Anweisungen ADD und COPY in Docker, die darauf abzielen, die Sicherheit, Transparenz und Effizienz beim Erstellen von Images zu verbessern.

Der Hauptunterschied zwischen ADD und COPY:

  • COPY kopiert einfach Dateien und Verzeichnisse vom angegebenen Quellort auf dem Host zum Zielort im Container. Die Quelle muss eine lokale Datei oder ein Verzeichnis sein.
  • ADD hat erweiterte Fähigkeiten: Es kann lokale Dateien und Verzeichnisse kopieren, Archive extrahieren (tar, gzip, bzip2) und Dateien von URLs herunterladen.

Beste Praktiken:

  1. Bevorzugen Sie COPY gegenüber ADD: In den meisten Fällen ist COPY ausreichend. Es ist transparenter, da es einfach lokale Dateien kopiert. Die Verwendung von ADD zum Extrahieren von Archiven oder Herunterladen von URLs kann weniger vorhersehbar sein und die Build-Komplexität erhöhen.

  2. Verwenden Sie COPY für lokale Dateien: Wenn Sie Dateien aus dem Build-Kontext in das Image kopieren müssen, verwenden Sie immer COPY.

    # Anstelle von ADD . /app
    COPY . /app 
    
  3. Seien Sie vorsichtig bei URLs in ADD: Die Verwendung von ADD mit einer URL kann zu Instabilität beim Build führen, wenn die entfernte Ressource nicht verfügbar ist. Außerdem ist es weniger sicher, da es von einer externen Quelle abhängt. Es ist vorzuziehen, curl oder wget in einer separaten Schicht (RUN) zu verwenden, um Ressourcen von URLs herunterzuladen, was mehr Kontrolle ermöglicht und die Prüfsumme überprüft.

    # Anstelle von 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. Extrahieren Sie Archive in einer separaten Schicht bei Verwendung von ADD: Wenn Sie müssen, ADD zum Extrahieren eines Archivs verwenden (weniger verbreitet), stellen Sie sicher, dass Sie dies in einer separaten Schicht tun. Wie bereits erwähnt, ist es jedoch in der Regel besser, die Extraktion explizit mit RUN durchzuführen.

  5. Kopieren Sie nur die benötigten Dateien: Kopieren Sie nicht den gesamten Build-Kontext (COPY . /app), wenn darin unnötige Dateien enthalten sind (Quellcode, Testdaten, versteckte Verzeichnisse usw.). Verwenden Sie .dockerignore, um diese Dateien auszuschließen. Dies reduziert die Image-Größe und beschleunigt den Build, indem die Datenmenge, die an den Docker-Daemon übertragen wird, verringert wird.

    Beispiel .dockerignore:

    .git
    node_modules
    *.log
    tmp/
    
    # Kopieren Sie nur die benötigten Dateien nach Anwendung von `.dockerignore`
    COPY . /app
    
  6. Verwenden Sie absolute Pfade für Zielorte: Geben Sie immer absolute Pfade im Image an (/app, /usr/local/bin usw.). Dies macht das Dockerfile verständlicher und vorhersehbarer, da Unsicherheiten bezüglich des aktuellen Arbeitsverzeichnisses (WORKDIR) vermieden werden.

    # Immer absolute Zielpfade angeben
    COPY src /app/src
    
  7. Variieren Sie die Reihenfolge je nach Änderungsfrequenz: Platzieren Sie COPY- oder ADD-Anweisungen für Dateien, die seltener geändert werden (z.B. Abhängigkeitsdateien wie package.json, requirements.txt), oben im Dockerfile, und die Anweisungen für Dateien, die häufiger geändert werden (Anwendungscode), unten. Dies ermöglicht es Docker, den Cache der Schichten effizient zu nutzen.

    # Abhängigkeitsdateien (ändern sich seltener)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Anwendungscode (ändert sich häufiger)
    COPY . /app/ 
    

Kurztabelle:

Anweisung Beschreibung Empfohlene Verwendung Was vermieden werden sollte
COPY Kopiert lokale Dateien/Verzeichnisse Kopieren lokaler Dateien und Verzeichnisse in das Image. Verwendung, wenn Archive extrahiert oder von URL heruntergeladen werden muss.
ADD Kopiert lokale Dateien/Verzeichnisse, extrahiert Archive, lädt von URL Verwendung für automatische Archivextraktion (selten). Verwendung zum Kopieren lokaler Dateien (bevorzugen Sie COPY). Verwendung zum Herunterladen von URLs.

Die Einhaltung dieser Praktiken führt zu zuverlässigeren, sichereren und effizienteren Docker-Images.