«1. Введение

При создании файлов Docker часто бывает необходимо перенести файлы из хост-системы в образ Docker. Это могут быть файлы свойств, собственные библиотеки или другой статический контент, который потребуется нашим приложениям во время выполнения.

Спецификация Dockerfile предоставляет два способа копирования файлов из исходной системы в образ: директивы COPY и ADD.

В этой статье мы рассмотрим различия между ними и когда имеет смысл использовать каждый из них.

2. Разница между COPY и ADD

На первый взгляд директивы COPY и ADD выглядят одинаково. У них одинаковый синтаксис:

COPY <source> <destination>
ADD <source> <destination>

И оба копируют файлы из хост-системы в образ Docker.

Так какая разница? Короче говоря, директива ADD более функциональна, чем COPY.

Несмотря на схожесть функций, директива ADD обладает двумя преимуществами:

    Она может обрабатывать удаленные URL-адреса. Она может автоматически извлекать tar-файлы.

Давайте рассмотрим их подробнее.

Во-первых, директива ADD может принимать удаленный URL-адрес в качестве исходного аргумента. Директива COPY, с другой стороны, может принимать только локальные файлы.

Обратите внимание, что использование ADD для извлечения удаленных файлов и копирования обычно не является идеальным. Это связано с тем, что файл увеличит общий размер образа Docker. Вместо этого мы должны использовать curl или wget для извлечения удаленных файлов и удаления их, когда они больше не нужны.

Во-вторых, директива ADD автоматически расширяет файлы tar в файловую систему образа. Хотя это может уменьшить количество шагов Dockerfile, необходимых для создания образа, это может быть нежелательно во всех случаях.

Обратите внимание, что автоматическое расширение происходит только в том случае, если исходный файл является локальным для хост-системы.

3. Когда использовать ADD или COPY

Согласно руководству по лучшим практикам Dockerfile, мы всегда должны отдавать предпочтение COPY вместо ADD, если только нам не нужна одна из двух дополнительных функций ADD.

Как отмечалось выше, использование ADD для копирования удаленных файлов в образ Docker создает дополнительный слой и увеличивает размер файла. Если вместо этого мы используем wget или curl, мы можем удалить файлы впоследствии, и они не останутся постоянной частью образа Docker.

Кроме того, поскольку команда ADD автоматически расширяет файлы tar и некоторые сжатые форматы, это может привести к тому, что в файловую систему наших образов будут записаны неожиданные файлы.

4. Заключение

В этом кратком руководстве мы рассмотрели два основных способа копирования файлов в образ Docker: ДОБАВИТЬ и КОПИРОВАТЬ. Хотя функционально директива COPY похожа, в большинстве случаев предпочтительнее. Это связано с тем, что директива ADD предоставляет дополнительные функции, которые следует использовать с осторожностью и только при необходимости.