Wat zijn de beste praktijken voor het gebruik van de instructies ADD en COPY in Docker?
sobes.tech AI
Antwoord van AI
Voor de instructies ADD en COPY in Docker zijn er enkele best practices die gericht zijn op het verbeteren van de veiligheid, transparantie en efficiëntie van het bouwen van images.
Het belangrijkste verschil tussen ADD en COPY:
COPYkopieert eenvoudigweg bestanden en directories van de opgegeven bron op de host naar de opgegeven bestemming in de container. De bron moet een lokaal bestand of directory zijn.ADDheeft bredere mogelijkheden: het kan lokale bestanden en directories kopiëren, evenals archieven (tar, gzip, bzip2) uitpakken en bestanden downloaden via URL.
Best practices:
-
Gebruik
COPYin plaats vanADD: In de meeste gevallen isCOPYvoldoende. Het is transparanter omdat het eenvoudigweg lokale bestanden kopieert. Het gebruik vanADDvoor het uitpakken van archieven of het downloaden via URL kan minder voorspelbaar zijn en de build complexer maken. -
Gebruik
COPYvoor lokale bestanden: Als je bestanden uit de build context naar het image wilt kopiëren, gebruik dan altijdCOPY.# In plaats van ADD . /app COPY . /app -
Wees voorzichtig met URL's in
ADD: Het gebruik vanADDmet URL kan leiden tot instabiele builds als de externe bron niet beschikbaar is. Het is ook minder veilig omdat je afhankelijk bent van een externe bron. Het wordt aanbevolen omcurlofwgette gebruiken in een aparte laag (RUN) om resources te downloaden via URL, wat meer controle geeft en checksum-verificatie mogelijk maakt.# In plaats van 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 -
Pak archieven uit in een aparte laag bij gebruik van
ADD: Als je moet gebruikenADDom een archief uit te pakken (minder gebruikelijk scenario), zorg er dan voor dat je dit in een aparte laag doet. Zoals eerder vermeld, is het vaak duidelijker om uit te pakken metRUN. -
Kopieer alleen de benodigde bestanden: Kopieer niet de hele build context (
COPY . /app) als er onnodige bestanden in zitten (broncode, testgegevens, verborgen directories, etc.). Gebruik.dockerignoreom deze bestanden uit te sluiten. Dit verkleint de image en versnelt de build doordat er minder data naar de Docker daemon wordt gestuurd.Voorbeeld
.dockerignore:.git node_modules *.log tmp/# Kopieer alleen de benodigde bestanden na toepassing van .dockerignore COPY . /app -
Gebruik absolute paden voor bestemmingen: Geef altijd een absoluut pad op in de image (/app, /usr/local/bin, etc.). Dit maakt de Dockerfile duidelijker en voorspelbaarder, en voorkomt onzekerheid over de huidige werkdirectory (
WORKDIR).# Geef altijd een absoluut pad op COPY src /app/src -
Varieer de volgorde afhankelijk van de frequentie van wijzigingen: Plaats
COPYofADDinstructies voor bestanden die minder vaak veranderen (zoals afhankelijkheden, zoalspackage.json,requirements.txt) hoger in de Dockerfile dan instructies voor bestanden die vaker veranderen (zoals de broncode van de applicatie). Dit maakt het mogelijk voor Docker om cachelagen efficiënt te gebruiken.# Afhankelijkheidsbestanden (veranderen minder vaak) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Broncode van de applicatie (verandert vaker) COPY . /app/
Samenvattingstabel:
| Instructie | Beschrijving | Aanbevolen gebruik | Waarop te vermijden |
|---|---|---|---|
COPY |
Kopieert lokale bestanden/directories | Kopieer lokale bestanden en directories naar het image | Gebruik niet als je archieven wilt uitpakken of downloaden via URL |
ADD |
Kopieert lokale bestanden/directories, pakt archieven uit, downloadt via URL | Gebruik voor automatische archivering uitpakken (zelden) | Gebruik niet voor kopiëren van lokale bestanden (gebruik COPY) of downloaden via URL |
Het naleven van deze praktijken leidt tot betrouwbaardere, veiligere en efficiëntere Docker-images.