Сборка, которую не страшно повторить
Зависимости слоёв, кэш, фиксированные версии и границы многостадийной сборки.
После урока вы сможете
- Объяснять промах кэша после COPY
- Различать тег и digest
- Читать COPY --from в многостадийном Dockerfile
Порядок отражает частоту изменений
В большом проекте установка зависимостей может занимать минуты, а исходник меняется несколько раз в час. Если сначала копировать весь проект, изменение одной строки кода заставит пересмотреть и следующие шаги сборки. Поэтому файлы зависимостей часто копируют раньше исходников.
# Схема для проекта с зависимостями, не для офлайн-лаборатории:
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
BuildKit переиспользует подходящий результат из кэша, когда инструкция и её зависимости не изменились. Указанный у pip параметр относится к кэшу самого pip, а не отключает кэш Docker. В нашем сервере сторонних зависимостей нет — добавлять requirements.txt ради этой схемы не нужно.
В учебной проверке каждая попытка получает отдельную машину, поэтому нельзя рассчитывать на кэш прошлой попытки. Оптимизация не должна быть условием корректности: правильный проект собирается и на чистой машине.
Подробнее: оптимизация кэша в документации Docker.