Лучшие практики кэширования слоев
Тема дорожной карты · Docker & Containers
Каждая инструкция Dockerfile создаёт слой, и BuildKit переиспользует его, если входные данные не изменились. Это основной рычаг ускорения сборок. Для эффективного кэширования следует расставить инструкции от наименее до наиболее изменяемых: сначала установка системных пакетов, затем копирование файлов зависимостей, таких как package.json или go.mod, и установка зависимостей. В конце следует копировать весь код проекта с помощью COPY . .. Частые ошибки включают ранний COPY . ., который ломает кеш всего нижестоящего на каждом коммите; apt-get update без apt-get install в одном RUN, что оставляет устаревший индекс; а также использование опции --no-cache, которая сводит всю систему кэширования на нет.
BuildKit (современный builder, дефолт с Yöntem 23.0) и multi-stage сборки предоставляют мощные инструменты для улучшения производительности сборки. Помимо этого, --mount=type=cache позволяет создавать постоянные кеши, а опции --cache-to и --cache-from позволяют использовать удалённые кеши. Важно помнить, что ARG используется для параметров сборки, в то время как ENV используется для параметров выполнения.
Как это работает
Лучшие практики кэширования слоев включают использование BuildKit, который позволяет эффективно переиспользовать слои, если входные данные не изменились. Многоэтапные сборки позволяют создавать временные контейнеры для выполнения различных задач, таких как установка системных пакетов или зависимостей, и затем переиспользовать эти слои в финальном образе. BuildKit также поддерживает использование build-secrets, что позволяет безопасно передавать секреты в процессе сборки, не сохраняя их в истории команд или в метаданных образа.
Кроме того, опция --mount=type=cache позволяет создавать постоянные кеши, которые могут быть использованы между разными сборками. Это особенно полезно, когда сборка качает пакеты или другие ресурсы, которые не изменяются часто. Опции --cache-to и --cache-from позволяют использовать удалённые кеши, что может значительно сократить время сборки.
Когда применять
BuildKit и опция --mount=type=cache должны использоваться везде, где сборка качает пакеты или другие ресурсы, которые не изменяются часто. Это особенно полезно в контексте CI/CD, где драматически сокращается время сборки. Мульти-платформенные сборки через buildx следует использовать, когда таргет и x86_64, и arm64 (Raspberry Pi, M-series Mac, Graviton). HEALTHCHECK следует использовать на любом долгом сервисе, чтобы сделать ожидания compose up и пробы оркестратора корректными.
Типичные ошибки
Типичные ошибки при использовании кэширования слоев включают секреты через ARG, которые утекают в историю и docker inspect; apt update без apt install в одном RUN, которое оставляет устаревший индекс; забытый DOCKER_BUILDKIT=1 на старом Docker, который даёт странные "unknown flag" на --mount; HEALTHCHECK каждые 30 секунд со стартом 90 секунд, что делает контейнер unhealthy ещё до готовности.