COPY просто копирует файлы и директории из контекста сборки в образ, без дополнительной логики. ADD делает то же, но ещё умеет автоматически распаковывать локальные tar-архивы и исторически поддерживал загрузку по URL (сейчас это считается плохой практикой). В реальных Dockerfile по умолчанию используют COPY, а ADD берут только при осознанной необходимости его дополнительных возможностей.
Инструкции COPY и ADD обе добавляют файлы в образ, но считаются разными по "уровню магии": COPY — простой и предсказуемый, ADD — более умный и потому потенциально менее прозрачный.
Основные отличия между ними:
COPY работает только с локальным контекстом сборки (файлы, доступные Docker-демону рядом с Dockerfile). ADD также в основном используется с локальными путями, а использование URL в новых проектах не рекомендуется из-за проблем с кэшированием и контролем скачиваемого содержимого.ADD умеет автоматически распаковывать локальные tar-архивы (например, .tar, .tar.gz) непосредственно в файловую систему образа. COPY в любом случае перенесёт архив как один файл без распаковки.COPY всегда очевидный результат: что указали в источнике, то и оказалось в образе, что упрощает анализ слоёв и поведение кэша. ADD может менять структуру файлов (из-за распаковки), и это усложняет понимание того, что именно появится в конкретном слое образа.COPY по умолчанию, а к ADD обращаться только тогда, когда вам действительно нужна именно автоматическая распаковка локального tar-архива и вы осознанно принимаете такую дополнительную логику.На собеседовании важно показать, что вы выбираете инструкцию осмысленно: COPY — основной и безопасный вариант, ADD — точечный инструмент для редких сценариев, где его расширенные возможности действительно полезны.
В этом примере COPY последовательно копирует зависимости и исходный код из локального контекста в образ, без какой-либо дополнительной логики. Такое поведение хорошо сочетается с кэшированием слоёв и делает итоговый образ предсказуемым.
Здесь в контексте сборки есть файл app.tar.gz, и инструкция ADD автоматически распакует его содержимое в директорию /app. Это избавляет от отдельной команды RUN tar -xzf ..., но такую "магическую" распаковку стоит использовать только тогда, когда она действительно упрощает Dockerfile и вы чётко понимаете её последствия.
Отметьте свой прогресс