ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

В чем разница между инструкциями COPY и ADD в Dockerfile?

В чем разница между инструкциями COPY и ADD в Dockerfile

Вы новичок в Docker и учитесь создавать собственные образы Docker с помощью Dockerfile.

Вы сталкиваетесь с различными инструкциями Dockerfile, такими как FROM, RUN и т. д.

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

В чем разница между инструкциями COPY и ADD в Dockerfile?

 

Почему в Dockerfile есть две команды для одной и той же задачи? Есть ли разница между ними? Действительно. У них схожие цели, но с точки зрения поведения они разные.

Позвольте нам объяснить это вам.

 

ADD против COPY в Dockerfile

И ADD, и COPY предназначены для добавления каталогов и файлов в ваш образ Docker.

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

Если ADD может все это сделать, зачем нам COPY? Это потому, что команды Docker уже несколько раз реструктурировались. Основное внимание уделяется обеспечению простой, понятной и более оптимизированной структуры команд.

COPY был представлен как прямая замена ADD. COPY просто копирует файлы и каталоги. Вот и все. Для загрузки и извлечения файлов с инструкциями RUN используются обычные команды Linux, такие как curl и tar.

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

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

Ознакомьтесь с инструкцией 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 для загрузки и извлечения файлов.

Если у вас есть какие-либо предложения, отзывы или комментарии по поводу приведенного выше сравнения, оставьте свои мысли в разделе ниже.

Exit mobile version