Какой у вас опыт с кешированием в Docker?

«Какой у вас опыт с кешированием в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я активно использую и настраиваю кеширование Docker для ускорения CI/CD пайплайнов и локальной разработки. Основные практики:

1. Понимание и использование слоев образа: Каждая инструкция в Dockerfile создает слой. Docker кеширует слои, которые не изменились с предыдущей сборки.

2. Оптимизация Dockerfile для кеша:

  • Порядок инструкций: Раннее копирование файлов зависимостей (package.json, requirements.txt, go.mod) и их установка.
  • Группировка команд RUN: Объединение команд в одну инструкцию RUN с && и очисткой кеша apt/yum для уменьшения количества слоев.
# Плохо для кеша
COPY . .
RUN npm install

# Хорошо для кеша
COPY package.json package-lock.json ./
RUN npm ci --only=production
COPY . .

3. Использование продвинутых возможностей:

  • BuildKit: Включаю через DOCKER_BUILDKIT=1. Он предоставляет более умное кеширование, включая кеш для инструкций RUN с --mount=type=cache.
    RUN --mount=type=cache,target=/var/cache/apt 
        apt-get update && apt-get install -y some-package
  • Многоступенчатые сборки (multi-stage): Позволяют отделить этап сборки (где кеш важен) от финального образа, уменьшая его размер.

4. Управление кешем в CI/CD: Настраиваю сохранение и восстановление кеша Docker слоев между запусками пайплайна (например, в GitLab CI с docker layer caching или в GitHub Actions с действием build-push-action и ключами кеша).