Вы новичок в Docker и учитесь создавать собственные образы Docker с помощью Dockerfile.
Вы сталкиваетесь с различными инструкциями Dockerfile, такими как FROM, RUN и т. д.
Затем вы сталкиваетесь с COPY и ADD и понимаете, что обе инструкции выполняют одну и ту же работу; скопируйте файлы и каталоги в измененный образ Docker с хоста.
Почему в Dockerfile есть две команды для одной и той же задачи? Есть ли разница между ними? Действительно. У них схожие цели, но с точки зрения поведения они разные.
Позвольте нам объяснить это вам.
ADD против COPY в Dockerfile
И ADD, и COPY предназначены для добавления каталогов и файлов в ваш образ Docker.
Инструкция ADD относительно старше и способна не только на копирование файлов и каталогов. ADD может извлекать файлы из внешних URL-адресов. Он также может извлекать сжатые файлы, если он поддерживает формат архива. Это также иногда создает проблему, если ADD не может поддерживать формат архива.
Если ADD может все это сделать, зачем нам COPY? Это потому, что команды Docker уже несколько раз реструктурировались. Основное внимание уделяется обеспечению простой, понятной и более оптимизированной структуры команд.
COPY был представлен как прямая замена ADD. COPY просто копирует файлы и каталоги. Вот и все. Для загрузки и извлечения файлов с инструкциями RUN используются обычные команды Linux, такие как curl и tar.
Это причина, по которой в наши дни рекомендуется COPY, и вы найдете ADD только в старых руководствах и документации.
Ознакомьтесь с инструкцией ADD.
Инструкция ADD имеет следующие три возможности:
1. Копирование локальных файлов в образ контейнера.
Скажем, например, если вы хотите скопировать локальные файлы в хост-системе из /home/user/application в образ Docker /opt/app, вы можете включить следующую инструкцию в свой Dockerfile:
ADD /home/user/application /opt/app
Здесь /home/user/application копируется только содержимое каталога /opt/app, включая его метаданные application. Сам каталог копировать не будет.
2. Извлечение локально сохраненных файлов tar.
Вы также можете использовать инструкцию ADD для извлечения сжатых архивов с форматами – identity , gzip , bzip2 или xz. Содержимое распаковывается в виде каталога внутри целевого расположения создаваемого вами образа Docker.
ADD /home/user/test.tar.gz /opt
Поведение аналогично тому, что происходит, когда вы используете команду tar для извлечения tarball в определенный каталог в вашей хост-системе.
3. Загрузите файл по URL-адресу.
Это похоже на то, как работает wget -P, но для Dockerfiles. При создании образа Docker вы можете использовать следующую инструкцию, чтобы загрузить файл и сохранить его в желаемом месте на образе контейнера:
ADD https://filesamples.com/samples/document/pdf/sample2.pdf /home/user
После того, как образ будет построен, вы можете получить этот PDF-документ заранее, чтобы запустить контейнер на его основе. Это один из многих уникальных вариантов использования.
Инструкция по копированию
Инструкция COPY – это эволюция инструкции ADD, которая была разработана, чтобы избежать путаницы среди пользователей Docker. Его функция всего одна – копировать файлы или каталоги из исходного местоположения на хосте в целевое местоположение на образе Docker.
Итак, это, по сути, первый пункт в разделе инструкций ADD, который обсуждался выше. Соответствующая инструкция будет такой:
COPY /home/user/application /opt/app
Разработчики Docker официально рекомендуют использовать приведенную выше инструкцию, чтобы избежать путаницы:
Различия между инструкциями COPY и ADD Dockerfile
Задача/Инструкция | COPY | ADD |
Скопируйте локальный файл или каталог с вашего хоста в образ Docker | ДА | ДА |
Загрузите файл с URL-адреса в образ Docker | НЕТ | ДА |
Извлечение файла tar из исходного файла в образ Docker | НЕТ | ДА |
Поэтому, если вы просто хотите скопировать файлы или каталоги, вам следует использовать только инструкцию COPY. По возможности старайтесь избегать использования ADD. Используйте инструкции RUN с обычными командами Linux для загрузки и извлечения файлов.
Если у вас есть какие-либо предложения, отзывы или комментарии по поводу приведенного выше сравнения, оставьте свои мысли в разделе ниже.