В чем разница между КОПИРОВАНИЕМ и ДОБАВЛЕНИЕМ в Dockerfiles? — CloudSavvy ИТ

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

КОПИРОВАТЬ

КОПИРОВАТЬ является более простой из двух инструкций. Он принимает два аргумента: источник и место назначения:

КОПИРОВАТЬ example.txt /example/dir/example.txt

Исходный путь будет скопирован с вашего хоста Docker в файловую систему контейнера. Созданный образ будет включать скопированный файл или каталог по указанному пути назначения.

COPY работает со всеми файлами и каталогами, но исходные пути ограничены теми, которые находятся в вашем активном контексте сборки. Контекст устанавливается при запуске сборки докера:

сборка докеров. # ИЛИ docker build / path / to / context

Инструкция автоматически создает целевой каталог в контейнере, если он еще не существует. Если вы добавите косую черту в конце (/), Docker будет рассматривать место назначения как каталог и поместит в него исходный файл.

Вы можете использовать подстановочные знаки, такие как * .jpg, в месте назначения исходного пути, чтобы соответствовать набору файлов. Эти выражения будут проанализированы с помощью Go сопоставитель пути к файлу.

Скопированные файлы по умолчанию имеют UID и GID, равные 0. Это можно настроить с помощью необязательного флага —chown, который принимает UID, GID и имена. Он запускает chown для скопированных файлов, когда они находятся внутри контейнера:

КОПИРОВАТЬ —chown = my-user: my-group example.txt /example.txt

COPY также поддерживает флаг —from. Это изменяет исходный путь для ссылки на Другая образ контейнера вместо локального контекста сборки. Он также работает с многоэтапными сборками для извлечения артефактов, созданных на более ранних этапах сборки.

# Копирует / usr / bin / composer из composer: latest image COPY —from = composer: latest / usr / bin / composer / usr / bin / composer # Пример многоступенчатой ​​сборки # Этап 1: Копирует example.scss из рабочего каталог в узел: последнее изображение # Этап 2: Копирует example.css, созданный на этапе 1, в окончательный образ (на основе httpd: latest) ОТ узла: последний AS sass COPY example.scss. ЗАПУСТИТЬ npm install -g node-sass && node-sass example.scss example.css FROM httpd: latest COPY —from = sass /example.css example.css

Флаг —from должен ссылаться на именованный этап, указанный ранее в файле Dockerfile. Когда этапа сопоставления нет, Docker предполагает, что вместо этого вы ссылаетесь на изображение. Вы столкнетесь с ошибкой сборки, если изображение не будет извлечено.

ДОБАВИТЬ

ДОБАВИТЬ имеет тот же синтаксис, что и COPY, принимая пути источника и назначения. Нет поддержки —from, но вы можете использовать —chown.

В отличие от COPY, ADD может загружать URL-адреса удаленных файлов. Если указать общедоступный URL-адрес в качестве исходного пути, этот файл будет загружен и добавлен в образ контейнера. Время изменения целевого пути (mtime) будет установлено равным значению заголовка Last-Modified в ответе HTTP загрузки.

ADD также может извлекать архивы tar, включая архивы, сжатые с помощью gzip, bzip2 и xz. Если указать совместимый архив в качестве исходного пути, его содержимое будет распаковано в указанный каталог контейнера. Существующее содержимое каталога будет сохранено.

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

Возможность автоматического извлечения архивов упрощает добавление программных пакетов, распространяемых в виде файлов tar, в образы контейнеров. Если указать путь tar для COPY, сжатый архивный файл будет скопирован как есть, а не его содержимое. Вам нужно будет использовать инструкцию RUN, чтобы вручную распаковать файл.

Поведение вокруг КОПИРОВАНИЯ применяется к ДОБАВИТЬ в. За исключением удаленных URL-адресов, исходные пути должны существовать в контексте сборки. Путь назначения контейнера будет автоматически создан, если он не существует, с помощью Docker’s правила для разрешения пути.

Резюме

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

Согласно собственному исследованию Докера руководство по передовой практике, вам следует использовать COPY, если вам не нужны дополнительные возможности ADD. ADD — это непрозрачная операция, которая добавляет волшебства процессу копирования.

Использование ADD только тогда, когда это действительно необходимо, помогает сообщить о ваших намерениях. В противном случае вы рискуете приучить членов команды использовать ADD, что может иметь катастрофические последствия. Непреднамеренное ДОБАВЛЕНИЕ my-archive.tar. вместо COPY my-archive.tar может вызвать путаницу и сломанные сборки, когда содержимое архива будет отображаться в вашем контейнере, а не в самом архиве.

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *