← Назад к вопросам
В чем разница между COPY и ADD в Docker?
1.2 Junior🔥 251 комментариев
#Docker и контейнеризация
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между COPY и ADD в Docker
Оба инструмента в Dockerfile используются для копирования файлов в образ контейнера, но ADD имеет дополнительные возможности, которые иногда приводят к неожиданному поведению. Modern best practices рекомендуют использовать COPY в большинстве случаев.
Основные различия
| Характеристика | COPY | ADD |
|---|---|---|
| Копирование файлов/папок | ✅ | ✅ |
| Копирование из 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 инженеров
- По умолчанию используйте COPY — это ясное намерение
- ADD используйте только для:
- Копирования tar архивов с автоматической распаковкой
- Загрузки файлов с URL (хотя лучше использовать RUN + curl/wget)
- Для распаковки архивов можно использовать оба, но явно лучше:
COPY app.tar.gz /tmp/ RUN cd /tmp && tar -xzf app.tar.gz -C /app/
Это делает процесс явным и помогает будущим разработчикам понять, что происходит.