Перейти к основному содержимому

Разница между COPY и ADD в Dockerfile

· 3 мин. чтения

1. Введение

При создании файлов Docker часто необходимо перенести файлы из хост-системы в образ Docker. Это могут быть файлы свойств, собственные библиотеки или другой статический контент, который потребуется нашим приложениям во время выполнения.

Спецификация Dockerfile предоставляет два способа копирования файлов из исходной системы в образ : директивы COPY и ADD .

В этой статье мы рассмотрим различия между ними и когда имеет смысл использовать каждый из них.

2. Разница между КОПИРОВАТЬ и ДОБАВИТЬ

На первый взгляд директивы COPY и ADD выглядят одинаково. У них одинаковый синтаксис:

COPY <source> <destination>
ADD <source> <destination>

И оба копируют файлы из хост-системы в образ Docker .

Так какая разница? Короче говоря, директива ADD более функциональна, чем COPY .

Хотя функционально директива ADD аналогична, она более эффективна в двух отношениях:

  • Он может обрабатывать удаленные URL-адреса
  • Он может автоматически извлекать файлы tar

Давайте посмотрим на них более внимательно.

Во-первых, директива ADD может принимать удаленный URL-адрес в качестве исходного аргумента. Директива COPY , с другой стороны, может принимать только локальные файлы.

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

Во - `` вторых, директива ADD автоматически расширяет файлы tar в файловую систему образа . Хотя это может уменьшить количество шагов Dockerfile, необходимых для создания образа, это может быть нежелательно во всех случаях.

Обратите внимание, что автоматическое расширение происходит только в том случае, если исходный файл является локальным для хост-системы.

3. Когда использовать ДОБАВИТЬ или КОПИРОВАТЬ

Согласно руководству по лучшим практикам Dockerfile , мы всегда должны отдавать предпочтение COPY вместо ADD , если только нам не нужна одна из двух дополнительных функций ADD .

Как отмечалось выше, использование ADD для копирования удаленных файлов в образ Docker создает дополнительный слой и увеличивает размер файла. Если вместо этого мы используем wget или curl , мы можем удалить файлы впоследствии, и они не останутся постоянной частью образа Docker.

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

4. Вывод

В этом кратком руководстве мы рассмотрели два основных способа копирования файлов в образ Docker: ADD и COPY . Хотя функционально директива COPY похожа, в большинстве случаев предпочтительнее. Это связано с тем, что директива ADD предоставляет дополнительные функции, которые следует использовать с осторожностью и только при необходимости.