При создании 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
команды. Тем самым вы избегаете создания дополнительного слоя изображения и экономите место.