← Назад к вопросам

В чем разница между COPY и ADD в Docker?

1.2 Junior🔥 251 комментариев
#Docker и контейнеризация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между COPY и ADD в Docker

Оба инструмента в Dockerfile используются для копирования файлов в образ контейнера, но ADD имеет дополнительные возможности, которые иногда приводят к неожиданному поведению. Modern best practices рекомендуют использовать COPY в большинстве случаев.

Основные различия

ХарактеристикаCOPYADD
Копирование файлов/папок
Копирование из URL
Автоматическое распаковки tar
ПредсказуемостьВысокаяНизкая
Рекомендуется использоватьДаТолько если нужны особенности

COPY — простое и понятное

COPY просто копирует файлы/директории из хоста в контейнер:

COPY src/ /app/src/
COPY config.yaml /app/config.yaml
COPY . /app/

Преимущества:

  • Прозрачное и предсказуемое поведение
  • Нет неожиданных побочных эффектов
  • Явно показывает намерение: "просто скопировать"
  • Лучше для кэширования слоёв

ADD — расширенные возможности

ADD может делать больше:

# 1. Копирование локальных файлов (как COPY)
ADD src/ /app/src/

# 2. Копирование с URL
ADD https://example.com/file.tar.gz /tmp/

# 3. Автоматическое распаковки tar/gzip
ADD app.tar.gz /app/  # Автоматически распакуется
ADD app.tar /app/     # Распакуется tar

Проблемы ADD:

  • Недокументированное поведение с tar файлами
  • Копирование с URL требует интернета при сборке
  • Путают разработчиков неожиданными распаковками
  • Сложнее отлаживать при ошибках

Практические примеры

❌ Плохо: использовать ADD без необходимости

FROM node:18
ADD package.json /app/
ADD src/ /app/src/

✅ Хорошо: использовать COPY для обычных случаев

FROM node:18
COPY package.json /app/
COPY src/ /app/src/

✅ Хорошо: использовать ADD только для распаковки

FROM ubuntu:22.04
# Загружаем архив и распаковываем в один слой
ADD https://example.com/app.tar.gz /app/
RUN cd /app && ./install.sh

Рекомендации DevOps инженеров

  1. По умолчанию используйте COPY — это ясное намерение
  2. ADD используйте только для:
    • Копирования tar архивов с автоматической распаковкой
    • Загрузки файлов с URL (хотя лучше использовать RUN + curl/wget)
  3. Для распаковки архивов можно использовать оба, но явно лучше:
    COPY app.tar.gz /tmp/
    RUN cd /tmp && tar -xzf app.tar.gz -C /app/
    

Это делает процесс явным и помогает будущим разработчикам понять, что происходит.