В чем разница между командами `COPY` и` ADD` в файле Docker?


Answers

COPY

То же, что и «ADD», но без обработки tar и удаленного URL.

Ссылка прямо из исходного кода .

Question

В чем разница между командами COPY и ADD в файле Docker, и когда я буду использовать один над другим?

COPY <src> <dest>

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

ADD <src> <dest>

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




Из документов Docker: docs.docker.com/engine/userguide/eng-image/…

«Хотя ADD и COPY функционально схожи, вообще говоря, COPY предпочтительнее, потому что он более прозрачен, чем ADD. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (например, удаленная поддержка URL-адресов), которые не сразу очевидны. Следовательно, наилучшим использованием ADD является автоматическое извлечение локального tar-файла в изображение, как в ADD rootfs.tar.xz /.

Если у вас несколько шагов Dockerfile, которые используют разные файлы из вашего контекста, COPY их отдельно, а не все сразу. Это гарантирует, что кеш сборки каждого шага недействителен (заставляя повторный запуск шага), если файлы, требующие особого действия, будут изменены.

Например:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Результаты уменьшают количество недействительных кешей для шага RUN, чем если вы поместите КОПИЮ. / 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

Для других элементов (файлов, каталогов), которые не требуют возможности автоматического извлечения ADD, вы всегда должны использовать COPY. "




Из документов Docker:

ДОБАВИТЬ ИЛИ КОПИРОВАТЬ

Хотя ADD и COPY функционально схожи, вообще говоря, COPY является предпочтительным. Это потому, что он более прозрачен, чем ADD. COPY поддерживает только базовое копирование локальных файлов в контейнер, в то время как ADD имеет некоторые функции (например, локальное удаление tar и поддержка удаленного URL), которые не сразу очевидны. Следовательно, наилучшим использованием ADD является автоматическое извлечение файла tar-файла в изображении, как в ADD rootfs.tar.xz /.

Подробнее: Лучшие практики написания Dockerfiles




docker build -t {image name} -v {host directory}:{temp build directory} .

Это еще один способ скопировать файлы в изображение. Опция -v временно создает том, который мы использовали во время процесса сборки.

Это отличается от других томов, потому что он монтирует только хост-каталог только для сборки. Файлы можно копировать с помощью стандартной команды cp.

Кроме того, как curl и wget, его можно запустить в стеке команд (выполняется в одном контейнере), а не умножать размер изображения. ADD и COPY не могут быть стекируемыми, поскольку они запускаются в автономном контейнере, а последующие команды в тех файлах, которые выполняются в дополнительных контейнерах, будут умножать размер изображения:

С настройками, установленными таким образом:

-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





Related



Tags

docker docker