🐳 Docker ADD и COPY: в чем разница?

by itisgood

Введение

ADD и COPY – это команды Docker для копирования файлов и каталогов в образ Docker с помощью Dockerfile.

Несмотря на различия в области применения, команды выполняют одну и ту же задачу.

В этой статье мы сравним Docker ADD и COPY и посоветуем, когда использовать каждую команду.

Обзор команды Docker ADD

Команда ADD предшествует команде COPY, поскольку она всегда была частью Docker.

Команда копирует файлы и каталоги в файловую систему образа Docker.

Основной синтаксис команды ADD следующий:

ADD  … [destination]

Синтаксис включает один или несколько файлов, каталогов или URL , за которыми следует каталог [destination] в файловой системе образа.

Если источником является каталог, команда ADD копирует все, включая метаданные файловой системы.

Чтобы добавить локально доступный файл в каталог изображения, введите:

ADD [path-to-local-file] [destination]

Например:

ADD /home/test/myapp/code.php  /root/myapp 
Примечание: исходные файлы и каталоги должны находиться в контекстном каталоге, то есть в каталоге, в котором пользователь будет выполнять команду docker build.
Чтобы скопировать файлы с URL-адреса, выполните следующую команду:
ADD [file-url] [destination]

ADD также может копировать сжатые файлы (tarball) и автоматически извлекать их содержимое в месте назначения.

Эта функция применима только к локально хранящимся сжатым файлам и каталогам.

Команда извлекает сжатый источник только в том случае, если он имеет распознанный формат сжатия (на основе содержимого файла, а не расширения).

К распознанным форматам сжатия относятся identity, gzip, bzip и xz.

Обзор команды Docker COPY

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

Единственной функцией команды COPY является копирование указанных файлов и каталогов в их существующем формате. Это ограничение распространяется на сжатые файлы, которые копируются как есть, то есть без извлечения.

Кроме того, COPY работает только с локально хранящимися файлами. Ее нельзя использовать с URL-адресами для копирования внешних файлов в изображение.

Чтобы использовать COPY, следуйте основному формату команды:

COPY  … [destination] 

Например, введите следующую команду, чтобы скопировать index.html из основного каталога контекста сборки в каталог /usr/local/apache2/htdocs в образе:

COPY index.html /usr/local/apache2/htdocs 

Docker выполняет команду, когда пользователь запускает процесс сборки с помощью docker build:

docker build -t [image-name] .

Команда Docker ADD и команда COPY: В чем различия?

В той части, где их сценарии использования пересекаются, ADD и COPY работают одинаково.

Обе команды копируют содержимое локально доступного файла или каталога в файловую систему внутри образа Docker.

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

Зачем использовать COPY вместо ADD в Dockerfile?

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

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

Для копирования удаленных файлов безопаснее и эффективнее использовать команду run в сочетании с wget или curl. Этот метод позволяет избежать создания дополнительного слоя образа и экономит место.

В следующем примере показана инструкция Dockerfile, которая использует RUN для загрузки сжатого пакета с URL-адреса, извлечения содержимого и очистки архива.

RUN curl http://source.file/package.file.tar.gz \
  | tar -xjC /tmp/ package.file.tar.gz \
  && make -C /tmp/ package.file.tar.gz

Заключение

В этой статье мы сравнили ADD и COPY, две команды, используемые в Dockerfile для копирования файлов и каталогов в образ Docker.

Мы представили COPY как рекомендуемый выбор и показали, как минимизировать использование ADD в ваших Docker файлах.

 

Loading

You may also like

Leave a Comment