Короткий ответ
Такой порядок позволяет Docker кэшировать слой с зависимостями и переустанавливать их только при изменении requirements.txt, а не при каждом изменении кода; если скопировать весь код сразу, любое изменение файла инвалидирует кэш и зависимости переустанавливаются заново.
Как это работает подробнее
Docker строит образ послойно и кэширует каждый слой по хешу инструкции и входных данных; если слой не изменился, Docker берёт его из кэша, иначе пересобирает его и все последующие слои.
Пример кода
Пример конфигурации
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]Что использовать на практике
- Рекомендация. правильный порядок —
COPY requirements.txt ., затемRUN pip install, и только потомCOPY . .; тогда при правке.py-файла пересобирается только быстрый слой копирования кода.
Подводные камни
- Риск.
COPY . .одной командой в начале Dockerfile — любое изменение в коде инвалидирует кэш pip install и заставляет переустанавливать все пакеты при каждой сборке.