Введение
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
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 файлах.