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