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

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

1.0 Junior🔥 171 комментариев
#MLOps и инфраструктура

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

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

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

Инструкция COPY в Dockerfile

INSTRUCTION COPY в Dockerfile предназначена для копирования файлов и директорий с хоста (локальной машины) в образ Docker контейнера. Это один из наиболее важных инструментов при построении Docker образов для Data Science приложений.

Основное назначение

Инструкция COPY копирует файлы и папки из контекста сборки (build context) на хост-машине в файловую систему контейнера. Это необходимо, чтобы ваш код, данные, конфигурационные файлы и другие зависимости были доступны внутри контейнера во время его работы.

Синтаксис и примеры

Базовый синтаксис:

COPY <источник> <пункт назначения>

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

# Копирование одного файла
COPY requirements.txt /app/requirements.txt

# Копирование всех файлов из текущей директории
COPY . /app

# Копирование директории
COPY ./src /app/src

# Копирование с сохранением структуры
COPY ./models/* /app/models/

# Копирование с установкой владельца (если базовый образ поддерживает)
COPY --chown=www-data:www-data ./app /var/www/

Типичный Dockerfile для Data Science проекта

FROM python:3.11-slim

# Установка рабочей директории
WORKDIR /app

# Копирование requirements для установки зависимостей
COPY requirements.txt .

# Установка зависимостей
RUN pip install --no-cache-dir -r requirements.txt

# Копирование кода приложения
COPY ./src ./src
COPY ./models ./models
COPY ./data ./data

# Установка точки входа
ENTRYPOINT ["python", "src/main.py"]

Почему COPY важна для Data Science

1. Включение кода в образ — ваш Python код, скрипты для обработки данных и обучения моделей должны быть в контейнере.

2. Копирование моделей — предварительно обученные ML-модели (в формате .pkl, .h5, .onnx) копируются в образ для использования при inference.

# Копирование обученной модели
COPY ./models/trained_model.pkl /app/models/

3. Включение конфигураций — параметры обучения, пути к данным, гиперпараметры.

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

4. Данные для инициализации — если нужны какие-то данные внутри контейнера (например, справочники, предварительно обработанные датасеты).

COPY vs ADD

В Docker есть похожая инструкция ADD, но COPY предпочтительна:

ХарактеристикаCOPYADD
Копирует файлы с хостаДаДа
Распаковывает архивыНетДа
Загружает с URLНетДа
Простота и предсказуемостьВысокаяМожет быть сложнее

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

Оптимизация Docker образа

Порядок инструкций влияет на эффективность кэширования слоёв Docker:

# Плохо: изменение кода часто вызывает пересборку всех зависимостей
COPY . /app
RUN pip install -r requirements.txt

# Хорошо: зависимости кэшируются, пересчитываются только при их изменении
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app

Это значительно ускоряет разработку, так как при каждом изменении кода не требуется переустанавливать все зависимости.

Контекст сборки

COPY работает только с файлами, находящимися в контексте сборки (папке, указанной в команде docker build):

# Контекст сборки — текущая директория (.)
docker build -t my-model:latest .

Файлы вне контекста (например, в родительской директории) недоступны для COPY, даже если указать абсолютный путь.

Игнорирование файлов

Используйте .dockerignore, чтобы исключить ненужные файлы из контекста:

.git
.gitignore
__pycache__
*.pyc
.venv
.env
node_modules

Заключение

Инструкция COPY — это фундамент для доставки кода и модели в Docker контейнер. Правильное использование COPY вместе с оптимизацией порядка инструкций обеспечивает быстрые сборки, меньше ошибок и более эффективное использование кэша Docker.

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