Vraag Wat is het verschil tussen de `COPY` en` ADD` -commando's in een Docker-bestand?


Wat is het verschil tussen de COPY en ADD opdrachten in een Docker-bestand en wanneer zou ik de ene boven de andere gebruiken?


COPY <src> <dest>

De COPY-instructie kopieert nieuwe bestanden van <src> en voeg ze toe   het bestandssysteem van de container op pad <dest>


ADD <src> <dest>

De ADD-instructie zal nieuwe bestanden kopiëren van <src> en voeg ze toe aan de   container-bestandssysteem op pad <dest>.


1483
2017-07-25 14:31


oorsprong


antwoorden:


Controleer de ADD en COPY documentatie voor een uitputtende beschrijving van hun gedrag, maar in een notendop is het grootste verschil dat ADD kan meer dan doen COPY:

  • ADD toestaat <src> om een ​​URL te zijn
  • Als het <src> parameter van ADD is een archief in een herkende compressie-indeling, het zal worden uitgepakt

Merk op dat de Praktische tips voor het schrijven van Dockerfiles stelt voor om te gebruiken COPY waar de magie van ADD is niet nodig. Anders zul je (omdat je dit antwoord moest opzoeken) op een dag waarschijnlijk verrast worden als je wilt kopiëren keep_this_archive_intact.tar.gz in je container, maar in plaats daarvan spuit je de inhoud op je bestandssysteem.


1482
2017-07-25 14:52



COPY is

Hetzelfde als 'TOEVOEGEN', maar zonder de verwerking van tar en externe URL's.

Referentie rechtstreeks uit de broncode.


294
2017-09-30 16:13



Er is wat officiële documentatie over dat punt: Praktische tips voor het schrijven van Docker-bestanden 

Omdat de afbeeldingsgrootte van belang is, met behulp van ADD het ophalen van pakketten van externe URL's wordt sterk afgeraden; je zou ... moeten gebruiken curl of wget in plaats daarvan. Op die manier kunt u de bestanden verwijderen die u niet langer nodig hebt nadat ze zijn uitgepakt en hoeft u geen nieuwe laag toe te voegen aan uw afbeelding.

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

Voor andere items (bestanden, mappen) die niet nodig zijn ADD'S teel auto-extractie vermogen, moet je altijd gebruiken COPY.


116
2017-10-02 08:21



Van Docker-documenten:

ADD of COPY

Hoewel ADD en COPY functioneel vergelijkbaar zijn, heeft COPY over het algemeen de voorkeur. Dat komt omdat het transparanter is dan ADD. COPY ondersteunt alleen het eenvoudig kopiëren van lokale bestanden naar de container, terwijl ADD enkele functies heeft (zoals lokale teerextractie en externe URL-ondersteuning) die niet meteen voor de hand liggen. Bijgevolg is het beste gebruik voor ADD lokale tar-bestandsautomatisering in de afbeelding, zoals in ADD rootfs.tar.xz /.

Meer: Praktische tips voor het schrijven van Dockerfiles


95
2017-08-10 15:19



Als u een xx.tar.gz wilt toevoegen aan een /usr/local in container, pak het uit en verwijder vervolgens het nutteloze gecomprimeerde pakket.

Voor COPY:

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

Voor ADD:

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADD ondersteunt lokale teerextractie. Daarnaast gebruikt COPY drie lagen, maar ADD gebruikt slechts één laag.


26
2018-04-25 07:07



Van Docker-documenten: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"Hoewel ADD en COPY functioneel vergelijkbaar zijn, heeft COPY over het algemeen de voorkeur, omdat het transparanter is dan ADD." COPY ondersteunt alleen het standaardkopiëren van lokale bestanden naar de container, terwijl ADD enkele functies heeft (zoals lokale teerextractie en externe URL-ondersteuning) die niet meteen voor de hand liggen. Het beste gebruik voor adhd is daarom lokale tar-bestandautomatisering in de afbeelding, zoals in ADD rootfs.tar.xz /.

Als u meerdere Dockerfile-stappen hebt die verschillende bestanden uit uw context gebruiken, kopieer ze dan afzonderlijk, in plaats van alles tegelijk. Dit zorgt ervoor dat de buildcache van elke stap alleen wordt ongeldig gemaakt (waardoor de stap wordt gedwongen opnieuw te worden uitgevoerd) als de specifiek vereiste bestanden veranderen.

Bijvoorbeeld:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Resultaten in minder cachevalidaties voor de RUN-stap, dan als u de COPY plaatst. / tmp / ervoor.

Omdat de afbeeldingsgrootte ertoe doet, wordt het gebruik van ADD om pakketten op te halen van externe URL's sterk afgeraden; u moet in plaats daarvan krul of wget gebruiken. Op die manier kunt u de bestanden verwijderen die u niet langer nodig hebt nadat ze zijn uitgepakt en hoeft u geen nieuwe laag toe te voegen aan uw afbeelding. U moet bijvoorbeeld vermijden dingen te doen zoals:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

En in plaats daarvan doe je iets als:

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

Voor andere items (bestanden, mappen) waarvoor geen adhd-automatische extractiefunctie van ADD vereist is, moet u altijd COPY gebruiken. "


11
2018-06-12 05:29



Belangrijke notitie

Ik moest javapakket kopiëren en untar in mijn docker afbeelding. Toen ik de afbeelding van de docker-afbeelding die met ADD werd gemaakt, vergeleek, was deze 180 MB groter dan die gemaakt met COPY, tar -xzf * .tar.gz en rm * .tar.gz

Dit betekent dat hoewel ADD het tar-bestand verwijdert, het nog steeds ergens wordt bewaard. En het maakt de afbeelding groot !!


0
2018-06-07 08:00



COPY kopieert een bestand / map van uw host naar uw afbeelding.

ADD kopieert een bestand / map van uw host naar uw afbeelding, maar kan ook externe URL's ophalen, TAR-bestanden extraheren, enz ...

Gebruik COPY voor het simpelweg kopiëren van bestanden en / of mappen naar de build-context.

Gebruik ADD voor het downloaden van externe bronnen, het extraheren van TAR-bestanden, enz.


0
2018-05-31 12:11



docker build -t {image name} -v {host directory}:{temp build directory} .

Dit is een andere manier om bestanden naar een afbeelding te kopiëren. Met de optie -v wordt tijdelijk een volume gemaakt dat we tijdens het bouwproces hebben gebruikt.

Dit is anders dan andere volumes omdat er een hostdirectory wordt gemount voor alleen de build. Bestanden kunnen worden gekopieerd met behulp van een standaard cp-opdracht.

Ook kan het, net als de curl en wget, worden uitgevoerd in een opdrachtstapel (wordt uitgevoerd in een enkele container) en mag de afbeeldingsgrootte niet worden vermenigvuldigd. ADD en COPY zijn niet stapelbaar omdat ze in een stand-alone container worden uitgevoerd en volgende opdrachten op die bestanden die in extra containers worden uitgevoerd, de afbeeldingsgrootte vermenigvuldigen:

Met de opties die zo zijn ingesteld:

-v /opt/mysql-staging:/tvol

Het volgende zal in één container worden uitgevoerd:

RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
    mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \

    mkdir /u1/mysql/mysql-files && \
    mkdir /u1/mysql/innodb && \
    mkdir /u1/mysql/innodb/libdata && \
    mkdir /u1/mysql/innodb/innologs && \
    mkdir /u1/mysql/tmp && \

    chmod 750 /u1/mysql/mysql-files && \
    chown -R mysql /u1/mysql && \
    chgrp -R mysql /u1/mysql

-1
2017-09-23 19:32