Під час створення Dockerfile є дві команди, які можна використовувати для копіювання файлів / каталогів у нього - ADDі COPY. Хоча є незначні відмінності в обсязі їх функції, вони по суті виконують одне і те ж завдання.
Отже, чому у нас є дві команди, і як ми знаємо, коли використовувати ту чи іншу?
DOCKER ADDCOMMAND
Почнемо з того, що 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-адреси. Команда не розпаковує зовнішні пакети при копіюванні їх у локальну файлову систему.
DOCKER COPYCOMMAND
Через деякі проблеми з функціональністю, Докер повинен був ввести додаткову команду для дублювання вмісту - 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команди. Тим самим ви уникаєте створення додаткового шару зображення та заощаджуєте простір.