При создании Dockerfile есть две команды, которые вы можете использовать для копирования файлов / каталогов в него - ADDи COPY. Хотя существуют небольшие различия в объеме их функций, они, по сути, выполняют одну и ту же задачу.
Итак, почему у нас есть две команды, и как мы знаем, когда использовать одну или другую?
ДОКЕРНАЯ ADDКОМАНДА
Давайте начнем с того, что отметим, что ADDкоманда старше, чем COPY. С момента запуска платформы Docker ADDинструкция была частью ее списка команд.
Команда копирует файлы / каталоги в файловую систему указанного контейнера.
Основной синтаксис ADDкоманды:
ADD <src> … <dest>
Он включает источник, который вы хотите скопировать ( <src>), а также место назначения, где вы хотите его сохранить ( <dest>). Если источником является каталог, ADDкопируется все внутри него (включая метаданные файловой системы).
Например, если файл доступен локально и вы хотите добавить его в каталог изображения, введите:
ADD /source/file/path /destination/path
ADDтакже можете копировать файлы с URL. Он может загрузить внешний файл и скопировать его в требуемое место назначения. Например:
ADD http://source.file/url /destination/path
Дополнительной функцией является то, что он копирует сжатые файлы, автоматически извлекая содержимое в указанном месте назначения. Эта функция применяется только к локально сохраненным сжатым файлам / каталогам.
ADD source.file.tar.gz /temp
Помните, что вы не можете скачать и извлечь сжатый файл / каталог из URL. Команда не распаковывает внешние пакеты при копировании их в локальную файловую систему.
ДОКЕРНАЯ COPYКОМАНДА
Из-за некоторых функциональных проблем Docker пришлось ввести дополнительную команду для дублирования контента - COPY.
В отличие от его тесно связанной ADDкоманды, COPYимеет только одну назначенную функцию. Его роль заключается в дублировании файлов / каталогов в указанном месте в их существующем формате. Это означает, что он не занимается извлечением сжатого файла, а скорее копирует его как есть.
Инструкция может использоваться только для локально сохраненных файлов. Поэтому вы не можете использовать его с URL-адресами для копирования внешних файлов в ваш контейнер.
Чтобы использовать COPYинструкцию, следуйте основному формату команды:
Введите источник и где вы хотите, чтобы команда извлекла содержимое следующим образом:
COPY <src> … <dest>
Например:
COPY /source/file/path /destination/path
Какую команду использовать? (Лучшая практика)
Учитывая обстоятельства, при которых COPYбыла введена команда, очевидно, что сохранение ADDбыло вопросом необходимости. Docker выпустил официальный документ с изложением лучших практик написания Dockerfiles, в котором явно не рекомендуется использовать ADDкоманду.
Официальная документация Докера отмечает, что это COPYвсегда должна быть инструкция, так как она более прозрачна, чем ADD.
Если вам нужно скопировать из локального контекста сборки в контейнер, придерживайтесь его COPY.
Команда Docker также настоятельно рекомендует использовать ADDдля загрузки и копирования пакета из URL. Вместо этого безопаснее и эффективнее использовать wget или curl внутри RUNкоманды. Тем самым вы избегаете создания дополнительного слоя изображения и экономите место.