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

Для чего нужна инструкция 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 - основное отличие

АспектCOPYADD
Копирование файловДаДа
Распаковка архивовНетДа
Загрузка с 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

Лучшие практики

  1. По умолчанию используй COPY
  2. ADD только для распаковки архивов
  3. Явно распаковывай архивы с помощью RUN
  4. Проверяй размер контекста сборки (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 более предпочтительна из-за прозрачности и контроля.

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