В чем разница между COPY
и ADD
команд в Dockerfile, и когда бы я использовать один над другим?
COPY <src> <dest>
Инструкция COPY скопирует новые файлы
<src>
и добавит их в файловую систему контейнера по пути<dest>
ADD <src> <dest>
Инструкция ADD скопирует новые файлы
<src>
и добавит их в файловую систему контейнера по пути<dest>
.
docker
dockerfile
Стив
источник
источник
COPY
выполнять каждый раз, когда он запускается, потому что он не обязательно имеет доступ к исходному контексту для захвата контента.Ответы:
Вы должны проверить
ADD
иCOPY
документацию для более подробного описания их поведения, но в двух словах, главное отличие состоит в том, чтоADD
может сделать больше, чемCOPY
:ADD
позволяет<src>
быть URLADD
документации говорится, что:Обратите внимание, что лучшие практики для написания Dockerfiles предлагают использовать
COPY
там, где магияADD
не требуется. В противном случае вы ( поскольку вам пришлось искать этот ответ ), скорее всего, однажды удивитесь, когда захотите скопироватьkeep_this_archive_intact.tar.gz
в свой контейнер, но вместо этого вы распыляете содержимое на свою файловую систему.источник
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
Docker ADDCOPY
являетсяСсылка прямо из исходного кода .
источник
ADD
также создает несуществующие каталоги . Так что, хотя это как-то не рекомендуется во всей этой цепочке, у него есть преимущество передCOPY
тем, что вам не нужно запускатьmkdir
и сохранять некоторые данныеСуществует некоторая официальная документация по этому вопросу: Лучшие практики для написания Dockerfiles
источник
COPY
, потому что это более прозрачно. Из рекомендаций по использованию файла Docker (2014-12-15):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Из документов Докера:
Подробнее: Лучшие практики для написания Dockerfiles
источник
Если вы хотите добавить xx.tar.gz во входной
/usr/local
контейнер, разархивируйте его, а затем удалите ненужный сжатый пакет.Для КОПИИ:
Для ДОБАВИТЬ:
ADD поддерживает локальное извлечение tar. Помимо этого, COPY будет использовать три слоя, но ADD использует только один слой.
источник
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
копирует файл / каталог с вашего хоста на ваше изображение.ADD
копирует файл / каталог с вашего хоста в ваше изображение, но также может извлекать удаленные URL, извлекать файлы TAR и т. д.Используйте
COPY
для простого копирования файлов и / или каталогов в контекст сборки.Используйте
ADD
для загрузки удаленных ресурсов, извлечения файлов TAR и т. Д.источник
Из документации Docker: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
«Хотя ADD и COPY функционально схожи, в общем случае, COPY предпочтительнее. Это потому, что он более прозрачен, чем ADD. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (такие как локальное извлечение tar и поддержка удаленного URL), которые не сразу очевидны. Следовательно, лучшее использование ADD - это автоматическое извлечение локального tar-файла в образ, как в ADD rootfs.tar.xz /.
Если у вас есть несколько шагов Dockerfile, которые используют разные файлы из вашего контекста, скопируйте их по отдельности, а не все сразу. Это гарантирует, что кэш сборки каждого шага становится недействительным (что приводит к повторному запуску шага), если изменяются специально необходимые файлы.
Например:
Приводит к меньшему количеству недействительности кэша для шага RUN, чем при установке COPY. / TMP / до этого.
Поскольку размер изображения имеет значение, использование ADD для извлечения пакетов из удаленных URL настоятельно не рекомендуется; вы должны использовать curl или wget вместо этого. Таким образом, вы можете удалить файлы, которые вам больше не нужны, после того, как они были извлечены, и вам не нужно будет добавлять еще один слой в изображение. Например, вы должны избегать таких вещей, как:
И вместо этого сделайте что-то вроде:
Для других элементов (файлов, каталогов), которые не требуют возможности автоматического извлечения tar из ADD, вы всегда должны использовать COPY. "
источник
Источник: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
источник
При создании Dockerfile есть две команды, которые вы можете использовать для копирования файлов / каталогов в него -
ADD
иCOPY
. Хотя существуют небольшие различия в объеме их функций, они, по сути, выполняют одну и ту же задачу.Итак, почему у нас есть две команды, и как мы знаем, когда использовать одну или другую?
ДОКЕРНАЯ
ADD
КОМАНДАДавайте начнем с того, что отметим, что
ADD
команда старше, чемCOPY
. С момента запуска платформы DockerADD
инструкция была частью ее списка команд.Команда копирует файлы / каталоги в файловую систему указанного контейнера.
Основной синтаксис
ADD
команды:Он включает источник, который вы хотите скопировать (
<src>
), а также место назначения, где вы хотите его сохранить (<dest>
). Если источником является каталог,ADD
копируется все внутри него (включая метаданные файловой системы).Например, если файл доступен локально и вы хотите добавить его в каталог изображения, введите:
ADD
также можете копировать файлы с URL. Он может загрузить внешний файл и скопировать его в требуемое место назначения. Например:Дополнительной функцией является то, что он копирует сжатые файлы, автоматически извлекая содержимое в указанном месте назначения. Эта функция применяется только к локально сохраненным сжатым файлам / каталогам.
Помните, что вы не можете скачать и извлечь сжатый файл / каталог из URL. Команда не распаковывает внешние пакеты при копировании их в локальную файловую систему.
ДОКЕРНАЯ
COPY
КОМАНДАИз-за некоторых функциональных проблем Docker пришлось ввести дополнительную команду для дублирования контента -
COPY
.В отличие от его тесно связанной
ADD
команды,COPY
имеет только одну назначенную функцию. Его роль заключается в дублировании файлов / каталогов в указанном месте в их существующем формате. Это означает, что он не занимается извлечением сжатого файла, а скорее копирует его как есть.Инструкция может использоваться только для локально сохраненных файлов. Поэтому вы не можете использовать его с URL-адресами для копирования внешних файлов в ваш контейнер.
Чтобы использовать
COPY
инструкцию, следуйте основному формату команды:Введите источник и где вы хотите, чтобы команда извлекла содержимое следующим образом:
Например:
Какую команду использовать? (Лучшая практика)
Учитывая обстоятельства, при которых
COPY
была введена команда, очевидно, что сохранениеADD
было вопросом необходимости. Docker выпустил официальный документ с изложением лучших практик написания Dockerfiles, в котором явно не рекомендуется использоватьADD
команду.Официальная документация Докера отмечает, что это
COPY
всегда должна быть инструкция, так как она более прозрачна, чемADD
.Если вам нужно скопировать из локального контекста сборки в контейнер, придерживайтесь его
COPY
.Команда Docker также настоятельно рекомендует использовать
ADD
для загрузки и копирования пакета из URL. Вместо этого безопаснее и эффективнее использовать wget или curl внутриRUN
команды. Тем самым вы избегаете создания дополнительного слоя изображения и экономите место.источник
Важная заметка
Я должен был
COPY
распаковать пакет java в моем образе докера. Когда я сравнил размер образа докера, созданного с помощью ADD, он был на 180 МБ больше, чем размер, созданный с помощью COPY, tar -xzf * .tar.gz и rm * .tar.gz.Это означает, что хотя ADD удаляет файл tar, он все равно где-то хранится. И это делает изображение больше!
источник
Поскольку Docker 17.05
COPY
используется с--from
флагом в многоэтапных сборках для копирования артефактов с предыдущих этапов сборки на текущий этап сборки.из документации
источник
Это еще один способ скопировать файлы в изображение. Опция -v временно создает том, который мы использовали в процессе сборки.
Это отличается от других томов, потому что он монтирует каталог хоста только для сборки. Файлы могут быть скопированы с помощью стандартной команды cp.
Также, как curl и wget, его можно запускать в стеке команд (работает в одном контейнере) и не увеличивать размер изображения. ADD и COPY нельзя наращивать, потому что они выполняются в автономном контейнере, и последующие команды для тех файлов, которые выполняются в дополнительных контейнерах, умножат размер изображения:
С параметрами, установленными таким образом:
Следующее будет выполняться в одном контейнере:
источник
unknown shorthand flag: 'v' in -v