В чем разница между командами 'COPY' и 'ADD' в файле докера.

docker dockerfile


В чем разница между командами COPY и ADD в Dockerfile и когда я буду использовать одну поверх другой?

COPY <src> <dest>

Инструкция COPY скопирует новые файлы из <src> и добавит их в файловую систему контейнера по пути <dest>

ADD <src> <dest>

Инструкция ADD скопирует новые файлы из <src> и добавит их в файловую систему контейнера по пути <dest> .




Answer 1 icecrime


Вы должны проверить документацию ADD и COPY для более подробного описания их поведения, но в двух словах, главное отличие состоит в том, что ADD может делать больше, чем COPY :

  • ADD позволяет <src> быть URL
  • Ссылаясь на комментарии ниже, в документации ADD говорится, что:

    Если это локальный tar-архив в распознанном формате сжатия (identity,gzip,bzip2 или xz),то он распаковывается как каталог.Ресурсы из удаленных URL не распаковываются.

Обратите внимание, что лучшие практики для написания Dockerfiles предлагают использовать COPY , где магия ADD не требуется. В противном случае вы ( так как вам пришлось искать этот ответ ), скорее всего, однажды удивитесь, если захотите скопировать keep_this_archive_intact.tar.gz в ваш контейнер, но вместо этого вы распыляете содержимое на свою файловую систему.




Answer 2 caike


COPY является

То же самое,что и 'ADD',но без tar и удаленной обработки URL.

Ссылка прямо из исходного кода .




Answer 3 Victor Laskin


Существует некоторая официальная документация по этому вопросу: Лучшие практики для написания Dockerfiles

Поскольку размер изображения имеет значение, использование ADD для извлечения пакетов из удаленных URL настоятельно не рекомендуется; вы должны использовать curl или wget вместо этого. Таким образом, вы можете удалить файлы, которые вам больше не нужны, после того, как они были извлечены, и вам не нужно будет добавлять еще один слой в изображение.

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

Для других элементов (файлов, каталогов), которые не требуют возможности автоматического извлечения tar из ADD , вы всегда должны использовать COPY .




Answer 4 eddd


Из Докерских докторов:

ДОБАВЛЕНИЕ или КОПИ

Хотя ADD и COPY функционально схожи, в общем, COPY является предпочтительным. Это потому, что он более прозрачен, чем ADD. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (такие как локальное извлечение tar и удаленную поддержку URL), которые не сразу очевидны. Следовательно, для ADD лучше всего использовать локальное извлечение файла tar в образ, как в ADD rootfs.tar.xz /.

Подробнее: Лучшие практики для написания Dockerfiles




Answer 5 BertLi


Если вы хотите добавить xx.tar.gz в /usr/local в контейнере, разархивируйте его, а затем удалите ненужный сжатый пакет.

Для КОПИ:

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

Для ADD:

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

ADD поддерживает только местное извлечение смолы.Кроме того,COPY будет использовать три слоя,но ADD использует только один слой.