Короткий ответ
COPY копирует локальные файлы и папки без дополнительной логики; ADD умеет дополнительно автоматически распаковывать локальные tar-архивы и скачивать файлы по URL, что делает её менее предсказуемой — поэтому по умолчанию рекомендуют COPY.
Как это работает подробнее
обе инструкции копируют содержимое из контекста сборки (или, для ADD, из внешнего URL) в указанный путь внутри образа, создавая новый слой. ADD дополнительно проверяет, является ли источник локальным tar/tar.gz/tar.bz2-архивом — если да, автоматически распаковывает его в целевую директорию.
Пример кода
Dockerfile
ADD app-dist.tar.gz /app/
COPY app-dist.tar.gz /app/Что использовать на практике
- Практика.
COPYпредсказуема и явна — что скопировали, то и получили;ADDстоит использовать только когда осознанно нужна автораспаковка локального архива. Скачивание файлов черезADD URLпо URL в современных Dockerfile не рекомендуется — лучше явныйRUN curl -o ... && ..., потому что так можно проверить контрольную сумму и управлять кэшированием слоя точнее.
Подводные камни
- Риск. используют
ADD"по привычке" для обычного копирования файлов, из-за чего поведение сборки для других членов команды становится менее очевидным; не замечают, чтоADDс архивом неожиданно распаковывает файлы там, где ожидалось просто скопировать архив целиком.