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:
COPYkopiert einfach Dateien und Verzeichnisse vom angegebenen Quellort auf dem Host zum Zielort im Container. Die Quelle muss eine lokale Datei oder ein Verzeichnis sein.ADDhat erweiterte Fähigkeiten: Es kann lokale Dateien und Verzeichnisse kopieren, Archive extrahieren (tar, gzip, bzip2) und Dateien von URLs herunterladen.
Beste Praktiken:
-
Bevorzugen Sie
COPYgegenüberADD: In den meisten Fällen istCOPYausreichend. Es ist transparenter, da es einfach lokale Dateien kopiert. Die Verwendung vonADDzum Extrahieren von Archiven oder Herunterladen von URLs kann weniger vorhersehbar sein und die Build-Komplexität erhöhen. -
Verwenden Sie
COPYfür lokale Dateien: Wenn Sie Dateien aus dem Build-Kontext in das Image kopieren müssen, verwenden Sie immerCOPY.# Anstelle von ADD . /app COPY . /app -
Seien Sie vorsichtig bei URLs in
ADD: Die Verwendung vonADDmit 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,curloderwgetin 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 -
Extrahieren Sie Archive in einer separaten Schicht bei Verwendung von
ADD: Wenn Sie müssen,ADDzum 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 mitRUNdurchzuführen. -
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 -
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 -
Variieren Sie die Reihenfolge je nach Änderungsfrequenz: Platzieren Sie
COPY- oderADD-Anweisungen für Dateien, die seltener geändert werden (z.B. Abhängigkeitsdateien wiepackage.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.