Рубрики
Uncategorized

Должен ли я использовать Add или Copy в DockerFile — Какая разница?

Каждый разработчик и каждая команда сталкивается с путаницей о копии и добавить в DockerFile в какой-то момент. … Теги с докером, дежоптом.

Каждый разработчик и каждая команда сталкивается с путаницей о Скопировать и Добавить в Dockerfile в какой-то момент. Когда у меня возникнет вопрос, сначала я обычно даю техническую справочную информацию, и это следующее:

Оба ДОБАВЛЯТЬ и Копия копировать файлы и каталоги с хост -машины в изображение Docker, разница в том, что ДОБАВЛЯТЬ Также можно извлечь и копировать локальные архивы TAR, а также можно также скачать файлы из URL (A.k.a. Интернет) и скопируйте их в образе связки. Лучшая практика — использовать Копия .

Итак, Скопировать равен Добавить минус распаковки и устранения URL-приборов. Скопировать является предпочтительным способом, за исключением случаев, если вы распаковываете местный архив TAR в Docker Image, и вы уверены, что локальный архив имеет правильный формат Отказ

Вы можете понять, почему это дело, глядя на некоторую фоновую информацию. Читать дальше…

Основная цель Добавить и Скопировать Сообщено, чтобы разработчики DockerFile копируйте файлы и каталоги от хост-машины в изображение Docker во время сборки изображений.

Извлечение архивов и загрузки файлов из Интернета являются общими случаями использования, эти функции встроены в Добавить Отказ

Функция развлечения описана в Официальная документация следующее:

Если является локальным архивом смолы в распознанном формате сжатия (идентичность, GZIP, BZIP2 или XZ ) Тогда он распакован как каталог.

Следующая записка на той же странице еще больше объясняет поведение:

Примечание. Идентифицируется ли файл как распознаваемый формат сжатия, выполняется исключительно на основе содержимого файла, а не имени файла. Например, если пустой файл будет заканчиваться .tar.gz Это не будет распознано в качестве сжатого файла и не будет генерировать какие-либо сообщения об ошибке декомпрессии, а файл будет просто скопирован в пункт назначения.

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

Чтобы сделать жизнь более надежными, у нас есть Скопировать Инструкция, которая является «То же самое, что и Добавить , но без смолы и обработки URL» Отказ Скопировать делает одну вещь, и это делает это хорошо Отказ

Докер лучших практик предложить всегда использовать Копия Когда вам не нужна функциональность извлечения, потому что Скопировать более прозрачен.

В реальных проектах Скопировать достаточно в большинстве сценариев В основном потому, что мы редко добавляем Tarballs в исходный код нашего приложения. Основной вариант использования для тарболов, таким образом, Добавить , когда мы создаем базовое изображение из архива смолы. Это не происходит очень часто. В этом случае Добавить является предпочтительным.

Для всех других случаев использования мы используем Скопировать ;

  • Мы предпочитаем Скопировать Для копирования файлов из хост-машины в изображение докера.
  • Мы используем Запустить с скручивание или wget Чтобы получить файлы с URL. Добавить Не распаковывает файлы из Интернета в любом случае, поэтому нам лучше избегать его целиком.

Давайте посмотрим, как вы можете выполнить распаковку и URL-приборов.

Добавить Распаковывает архивы из хост-машины, он не распаковывает файлы с URL. Распаковать архив, вы просто используете его в форме по умолчанию; Добавить ... Отказ Проверьте этот образец DockerFile:

FROM alpine:3.10

ADD bigfile.tar.xz /tmp/

Когда вы строите изображение Docker, распаковывает архив.

docker build -t yourname/alpine-bigfile .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM alpine:3.10
 ---> 4d90542f0623
Step 2/2 : ADD bigfile.tar.xz /tmp/
 ---> 32cfa3eb41f7
Successfully built 32cfa3eb41f7
Successfully tagged yourname/alpine-bigfile:latest

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

Наш архив в примере был признан Docker, поэтому файл несжат в нашем изображении:

docker run --rm -ti yourname/alpine-bigfile /bin/ash
/ # ls -al /tmp
total 12
drwxrwxrwt    1 root     root          4096 Jan 31 09:49 .
drwxr-xr-x    1 root     root          4096 Jan 31 09:50 ..
-rw-r--r--    1 501      dialout         29 Jan 31 09:46 bigfile

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

Для скачивания и распаковки архивов из Интернета Curl или wget являются лучшими вариантами, потому что требуется только один слой изображения, чтобы получить нужные результаты. С Добавить Вы сначала снимаете архив в один слой, затем распаковывают его с Запустить в другой. Это не так эффективно.

Вы можете построить DockerFile до Curl Архив и неудовлетворительный он, как показано ниже.

FROM alpine:3.10

RUN apk add --no-cache curl && \
  curl -SL https://github.com/yikaus/docker-alpine-base/raw/master/rootfs.tar.xz | tar -xJC /tmp

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

Еще одна примечательная разница между Добавить и Скопировать Это Скопировать имеет --for = <имя | index> Флаг, который позволяет скопировать файлы с предыдущего этапа сборки в многоступенчатой сборке. Добавить не имеет этой опции.

Это еще одна причина использовать Скопировать Как ваш предпочтительный вариант.

Оригинал: «https://dev.to/appfleet/shall-i-use-add-or-copy-in-the-dockerfile-what-s-the-difference-2o82»