Чем отличаются инструкции COPY и ADD в Dockerfile

Ответ

COPY и ADD — это инструкции в Dockerfile для копирования файлов в образ, но у них есть ключевые различия в функциональности и назначении.

COPY

Инструкция COPY имеет одну простую задачу: рекурсивно скопировать файлы и директории из исходного пути <src> в файловую систему контейнера по пути <dest>.

# Копирование одного файла
COPY ./requirements.txt /app/requirements.txt

# Копирование всей директории
COPY ./src /app/src

ADD

Инструкция ADD делает то же, что и COPY, но обладает двумя дополнительными возможностями:

  1. Распаковка архивов: Если исходный файл <src> является локальным архивом в формате tar, gzip, bzip2 или xz, он будет автоматически распакован в директорию назначения.
  2. Загрузка по URL: Если <src> является URL, файл будет загружен по этому адресу и скопирован в <dest>.
# Загрузка и сохранение файла
ADD https://example.com/file.txt /app/

# Автоматическая распаковка архива в /usr/local
ADD myapp.tar.gz /usr/local/

Ключевое правило и Best Practice

Всегда отдавайте предпочтение COPY. Его поведение прозрачно и предсказуемо — он только копирует файлы.

Используйте ADD только в тех редких случаях, когда вам действительно нужна его дополнительная функциональность (автоматическая распаковка tar-архивов). Для загрузки файлов по URL рекомендуется использовать связку RUN wget или RUN curl, так как это более гибкий и явный подход, позволяющий управлять процессом загрузки (например, удалять кэш после установки).