Для чего нужна инструкция ADD в Dockerfile?

Ответ

Инструкция ADD в Dockerfile копирует файлы, директории или удаленные ресурсы из контекста сборки или из сети внутрь образа. Её ключевые особенности:

  • Распаковка архивов: Автоматически распаковывает локальные .tar, .tar.gz, .tar.bz2, .tar.xz и .zip архивы при копировании.
  • Загрузка по URL: Может скачивать файлы из сети напрямую в образ.

Пример использования:

# Копирует и распаковывает архив в целевую директорию
ADD application.tar.gz /usr/src/app/

# Скачивает файл по URL в временную директорию
ADD https://example.com/config.yaml /tmp/config.yaml

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

Лучшие практики: Используйте COPY для обычного копирования файлов. Применяйте ADD только в специфичных случаях, когда нужна распаковка архивов или загрузка из сети.

Ответ 18+ 🔞

А, ну это про ту самую инструкцию ADD в Dockerfile, которая всех новичков вводит в ступор! Смотри, сейчас разжую, как есть.

В общем, представь, что ADD — это такой универсальный швейцарский нож, который умеет не только резать, но и консервную банку открыть, и вино откупорить. Основная его фишка — копировать всё подряд из твоего контекста сборки (или даже из интернета, ёпта!) прямо внутрь будущего образа.

Но главный прикол, из-за которого все мозги выносят, это две его суперспособности:

  1. Распаковка архивов. Это просто магия, я тебе скажу. Кинул ему в папку application.tar.gz, а он его, этот архив, как манда с ушами, сам развернул и содержимое раскидал по указанному пути. Работает с .tar, .gz, .bz2, .xz и даже .zip. Удобно, конечно, но иногда так неожиданно выстреливает, что сам от себя охуеешь — думал, скопирует файл, а он тебе полдиректории нахуй распаковал.

  2. Скачивание по URL. Нужен тебе какой-нибудь конфиг с удалённого сервака? Не вопрос, хуй с горы! Просто пишешь URL, и ADD сам всё скачает и положит куда скажешь. Прямо как заправский курьер, только бесплатный.

Вот смотри, как это выглядит в деле:

# Берёт локальный архив application.tar.gz, распаковывает его и сваливает всё содержимое в /usr/src/app/
ADD application.tar.gz /usr/src/app/

# Лезет в интернет, качает файлик по ссылке и кидает его в /tmp/
ADD https://example.com/config.yaml /tmp/config.yaml

А теперь про главное отличие от его младшего брата COPY. COPY — это как простой и надёжный слесарь. Дал ему файлы — он их тупо, без фокусов, перенёс из точки А в точку Б. Никаких сюрпризов. Предсказуемо и честно.

А ADD — это уже инженер с бзиком. Умный, мощный, но иногда такая хитрая жопа, что может натворить делов. Из-за этой его "магии" с архивами поведение не всегда очевидно с первого взгляда.

Так как же правильно, спросишь ты? А вот лучшая практика, которую все адекватные дядьки советуют:

  • Для 99% случаев бери COPY. Просто скопировать файлы или папки? COPY. Терпения ебать ноль на сюрпризы? COPY. Хочешь, чтобы всё было прозрачно и читаемо? COPY, ёбана рот!
  • А ADD прибереги для двух конкретных задач: когда тебе реально нужно распаковать архив прямо при сборке (и ты уверен, что это не выстрелит тебе в ногу) или когда надо скачать что-то из сети. Во всех остальных ситуациях — да похуй, используй COPY и спи спокойно.

Короче, запомни: ADD — инструмент мощный, но с характером. С ним нужно аккуратно, а то можно такого наворотить, что потом полдня будешь разгребать, почему образ собрался не так, как ты ожидал.