В чем разница между командами "копировать" и "добавить" в файле Dockerfile?
в чем разница между COPY и ADD команды в Dockerfile и когда я должен использовать один над другим?
COPY <src> <dest>
инструкция копирования будет копировать новые файлы из
<src>и добавить их в
файловая система контейнера по пути<dest>
ADD <src> <dest>
инструкция ADD будет копировать новые файлы из
<src>и добавить их в
файловая система контейнера по пути<dest>.
10 ответов:
COPYито же самое, что и "добавить", но без обработки tar и удаленного URL.
ссылка прямо из исходного кода.
есть некоторые официальные документы по этому вопросу:рекомендации по написанию Докерфайлов
потому что размер изображения имеет значение, используя
ADDдля извлечения пакетов из удаленных URL-адресов настоятельно не рекомендуется; вы должны использоватьcurlили . Таким образом, вы можете удалить файлы, которые вам больше не нужны после их извлечения, и вам не придется добавлять еще один слой в изображение.RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.gz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things allдля других элементов (файлы, каталоги), которые не требуют
ADDвозможность автоматического извлечения tar, вы всегда должны использоватьCOPY.
из Docker docs:
добавить или скопировать
хотя добавление и копирование функционально похожи, вообще говоря, копирование предпочтительнее. Это потому, что это более прозрачно, чем добавить. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (например, локальное извлечение tar и удаленная поддержка URL), которые не сразу очевидны. Следовательно, наилучшим использованием для добавления является локальное автоматическое извлечение файла tar в образ, как добавить файлы отсюда.смола.xz /.
Подробнее: рекомендации по написанию Докерфайлов
Если вы хотите добавить xx. tar.GZ в
/usr/localв контейнере распакуйте его, а затем удалите бесполезный сжатый пакет.для копирования:
COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/ RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local RUN rm /tmp/jdk-7u79-linux-x64.tar.gzАДД:
ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/добавить поддерживает только локальное извлечение смолы. Кроме того, COPY будет использовать три слоя, но ADD использует только один слой.
из Docker docs: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
" хотя добавление и копирование функционально похожи, вообще говоря, копирование предпочтительнее. Это потому, что это более прозрачно, чем добавить. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (например, локальное извлечение tar и удаленная поддержка URL), которые не сразу очевидны. Следовательно, лучший использование для добавления - это локальное автоматическое извлечение файла tar в образ, как в ADD rootfs.смола.xz /.
Если у вас есть несколько шагов Dockerfile, которые используют разные файлы из вашего контекста, скопируйте их по отдельности, а не все сразу. Это гарантирует, что кэш сборки каждого шага будет недействительным (заставляя шаг быть повторно запущенным), если специально требуемые файлы изменятся.
например:
COPY requirements.txt /tmp/ RUN pip install --requirement /tmp/requirements.txt COPY . /tmp/приводит к меньшему количеству недействительности кэша для шага выполнения, чем если бы ты положил копию . /tmp / перед этим.
поскольку размер изображения имеет значение, использование ADD для извлечения пакетов из удаленных URL-адресов настоятельно не рекомендуется; вместо этого следует использовать curl или wget. Таким образом, вы можете удалить файлы, которые вам больше не нужны после их извлечения, и вам не придется добавлять еще один слой в изображение. Например, вы должны избегать делать такие вещи, как:
ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things allи вместо этого сделать что-то вроде:
RUN mkdir -p /usr/src/things \ && curl -SL htt,p://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things allдля других элементов (файлов, каталогов) это не требует возможности автоматического извлечения tar ADD, вы всегда должны использовать COPY."
COPYкопирует файл/каталог с вашего хоста в ваш образ.
ADDкопирует файл / каталог с вашего хоста на ваше изображение, но также может извлекать удаленные URL-адреса, извлекать файлы TAR и т. д...использовать
COPYдля простого копирования файлов и/или каталогов в контексте сборки.использовать
ADDдля загрузки удаленных ресурсов, извлечения файлов TAR и т. д..
копирование и добавление-это инструкции Dockerfile, которые служат аналогичным целям. Они позволяют копировать файлы из определенного места в образ Docker.
копия принимает в src и назначения. Он позволяет копировать только локальный файл или каталог с вашего хоста (компьютер, создающий образ Docker) в сам образ Docker.
добавить позволяет сделать это, но он также поддерживает 2 других источников. Во-первых, вы можете использовать URL вместо локального файла / каталога. Во вторых, вы можете извлечь файл tar из источника непосредственно в пункт назначения
допустимый вариант использования ADD - это когда вы хотите извлечь локальный файл tar в определенный каталог в образе Docker.
Если вы копируете локальные файлы в образ Docker, всегда используйте COPY, потому что он более явный.
Ссылка : https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile
Важное Замечание
Я должен
COPYи untar java пакет в моем образе докера. Когда я сравнил размер изображения docker, созданный с помощью ADD, он был на 180 МБ больше, чем тот, который был создан с помощью COPY, tar-xzf *.смола.gz и rm *.смола.ГЗЭто означает, что хотя ADD удаляет файл tar, он все еще хранится где-то. И это делает изображение больше!!
docker build -t {image name} -v {host directory}:{temp build directory} .Это еще один способ копирования файлов в изображение. Параметр-v временно создает том, который используется в процессе сборки.
Это отличается от других томов, потому что он монтирует каталог хоста только для сборки. Файлы могут быть скопированы с помощью стандартной команды cp.
кроме того, как curl и wget, он может быть запущен в стеке команд (работает в одном контейнере) и не умножать размер изображения. Добавить и скопировать не укладываются, потому что они запускаются в отдельном контейнере, и последующие команды для тех файлов, которые выполняются в дополнительных контейнерах, будут умножать размер изображения:
с параметрами, установленными таким образом:
-v /opt/mysql-staging:/tvolв одном контейнере будет выполняться следующее:
RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \ mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \ mkdir /u1/mysql/mysql-files && \ mkdir /u1/mysql/innodb && \ mkdir /u1/mysql/innodb/libdata && \ mkdir /u1/mysql/innodb/innologs && \ mkdir /u1/mysql/tmp && \ chmod 750 /u1/mysql/mysql-files && \ chown -R mysql /u1/mysql && \ chgrp -R mysql /u1/mysql
Comments