← Назад к вопросам
Для чего нужна инструкция ADD в Dockerfile?
2.0 Middle🔥 132 комментариев
#MLOps и инфраструктура
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Инструкция ADD в Dockerfile
ADD - это инструкция для копирования файлов и директорий с локальной машины в образ Docker.
Синтаксис
ADD <source> <destination>
ADD ["<source>", "<destination>"]
Назначение
- Копирует файлы и папки с хоста (вашей машины) в контейнер
- Может распаковывать архивы (tar, tar.gz, tar.bz2, tar.xz)
- Может загружать файлы по URL
Основные возможности
1. Копирование файлов
# Копируем requirements.txt в /app/
ADD requirements.txt /app/
# Копируем всю директорию
ADD ./src /app/src
2. Автоматическая распаковка архивов
# Автоматически распакует
ADD model.tar.gz /app/models/
# Результат: файлы будут в /app/models/
ADD data.tar.bz2 /data/
3. Загрузка с URL
# Загружает файл прямо из интернета
ADD https://example.com/model.bin /app/models/
Практический пример: Data Science проект
FROM python:3.11-slim
WORKDIR /app
# Копируем requirements
ADD requirements.txt .
RUN pip install -r requirements.txt
# Копируем исходный код
ADD src /app/src
# Копируем и распаковываем данные
ADD data.tar.gz /app/data/
# Копируем модель
ADD model.pkl /app/models/
ENTRYPOINT ["python", "src/main.py"]
ADD vs COPY - основное отличие
| Аспект | COPY | ADD |
|---|---|---|
| Копирование файлов | Да | Да |
| Распаковка архивов | Нет | Да |
| Загрузка с URL | Нет | Да |
| Рекомендуется | Частая сит. | Редко |
| Производительность | Лучше | Хуже (может распаковывать) |
Когда использовать ADD
1. Когда нужна автоматическая распаковка
ADD model_weights.tar.gz /app/models/
# Уменьшает размер контекста сборки
2. Когда файлы хранятся архивом на GitHub
ADD https://github.com/user/repo/archive/main.tar.gz /tmp/
RUN cd /tmp && tar -xzf main.tar.gz
Когда использовать COPY (лучше)
1. Обычное копирование файлов
# Предпочтительно
COPY requirements.txt .
COPY src /app/src
COPY config.yaml /app/
2. Явное управление
# Лучше быть явным
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /app/data/
RUN rm /tmp/data.tar.gz
Рекомендации
Используй COPY по умолчанию:
# Хороший Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src ./src
COPY models ./models
CMD ["python", "src/app.py"]
Используй ADD только если нужна распаковка:
# Когда ADD имеет смысл
ADD large_dataset.tar.gz /data/
# Это сэкономит место в контексте сборки
Проблемы с ADD
1. Неочевидное поведение
# Ожидаешь копирование, а архив распакуется
ADD app.tar /app/ # Распакуется!
# Если хочешь просто скопировать:
COPY app.tar /app/
RUN cd /app && tar -xf app.tar
2. Загрузка с URL может быть ненадежна
# Рискованно - URL может упасть
ADD https://example.com/file.tar.gz /tmp/
# Лучше
RUN curl -o /tmp/file.tar.gz https://example.com/file.tar.gz && \
tar -xzf /tmp/file.tar.gz
3. Безопасность
# ADD может выполнять неожиданные операции
# Явное лучше неявного
COPY requirements.txt .
RUN pip install -r requirements.txt
Лучшие практики
- По умолчанию используй COPY
- ADD только для распаковки архивов
- Явно распаковывай архивы с помощью RUN
- Проверяй размер контекста сборки (
docker buildвыдаст info)
Итоговый рекомендуемый паттерн
FROM python:3.11-slim
WORKDIR /app
# Копируем dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем код
COPY src ./src
COPY config ./config
# Если нужны большие архивы - ADD
ADD models.tar.gz ./models/
EXPOSE 8000
CMD ["python", "src/app.py"]
Вывод: ADD полезна для распаковки архивов и может сэкономить место в контексте сборки, но в большинстве случаев COPY более предпочтительна из-за прозрачности и контроля.