Ответ
COPY
и ADD
— это инструкции в Dockerfile
для копирования файлов в образ, но у них есть ключевые различия в функциональности и назначении.
COPY
Инструкция COPY
имеет одну простую задачу: рекурсивно скопировать файлы и директории из исходного пути <src>
в файловую систему контейнера по пути <dest>
.
# Копирование одного файла
COPY ./requirements.txt /app/requirements.txt
# Копирование всей директории
COPY ./src /app/src
ADD
Инструкция ADD
делает то же, что и COPY
, но обладает двумя дополнительными возможностями:
- Распаковка архивов: Если исходный файл
<src>
является локальным архивом в форматеtar
,gzip
,bzip2
илиxz
, он будет автоматически распакован в директорию назначения. - Загрузка по 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
, так как это более гибкий и явный подход, позволяющий управлять процессом загрузки (например, удалять кэш после установки).