COPY vs ADD im Dockerfile - wann man was verwenden sollte
COPY vs ADD im Dockerfile - wann man was verwenden sollte
COPY und ADD kopieren beide Dateien in das Image — aber sie sind nicht austauschbar. Die Wahl zwischen den beiden ist eine Frage der Transparenz.
COPY: das klare Werkzeug
COPY tut genau eine Sache: Dateien oder Verzeichnisse vom Build-Kontext ins Image kopieren. Nicht mehr, nicht weniger.
COPY index.html /var/www/html/
COPY src/ /app/src/
COPY package.json package-lock.json /app/
Was man sieht, ist was passiert. Das macht COPY zur richtigen Wahl für den Großteil aller Anwendungsfälle.
ADD: der Schweizer Taschenmesser
ADD kann alles was COPY kann — und noch zwei Dinge mehr:
1. URLs als Quelle:
ADD https://example.com/config.tar.gz /tmp/
2. Automatisches Entpacken von tar-Archiven:
ADD archive.tar.gz /app/
# Inhalt von archive.tar.gz wird nach /app/ entpackt
Das klingt praktisch, ist aber oft eine Falle. Das automatische Entpacken passiert still — wer nicht weiß, was ADD macht, wundert sich über Dateien, die "magisch" im Image auftauchen.
Best Practice: fast immer COPY
Die offizielle Docker-Dokumentation empfiehlt COPY als Standard. ADD nur dann, wenn man die Extra-Funktionen bewusst und explizit braucht.
- Gründe für
COPY: - Vorhersagbares Verhalten — kein stilles Entpacken
- Klarer zu lesen für andere Entwickler
- Kein unerwartetes Netzwerk-Request beim Build
Für tar-Archive, die entpackt werden sollen, ist ADD legitim:
# Sinnvoll: Source-Archiv direkt entpacken
ADD src-v1.2.3.tar.gz /app/
Für URL-Downloads ist ADD weniger empfehlenswert, weil der Layer gecacht wird und spätere Änderungen an der URL nicht erkannt werden. Besser:
# Transparenter und cache-sicherer
RUN curl -fsSL https://example.com/tool.tar.gz | tar -xz -C /opt/tool
Zusammenfassung
| | COPY | ADD |
|---|---|---|
| Dateien kopieren | ja | ja |
| Verzeichnisse kopieren | ja | ja |
| URLs als Quelle | nein | ja |
| tar automatisch entpacken | nein | ja |
| Empfohlen als Standard | ja | nein |
Faustregel: Mit COPY anfangen. Nur zu ADD wechseln, wenn man das Entpacken von Archiven explizit will — und auch dann weiß man, warum.