Выбор ответа Middle Docker для разработчика спрашивают часто обновлено

Кеш слоёв и порядок COPY

Вопрос

Каждая правка любого файла в проекте вызывает долгий npm ci при сборке. Что исправить?

FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Сначала скопировать манифесты и npm ci, а COPY . . после. Docker берёт слой из кеша, только если не изменились инструкция и её входные файлы.

Варианты ответа

  1. Сначала скопировать манифесты и npm ci, а COPY . . послеправильный ответ
  2. Заменить npm ci на npm install, он использует кеш
  3. Добавить флаг --no-cache к сборке, чтобы не путать слои
  4. Объединить все RUN в одну строку через &&

Разбор

Docker берёт слой из кеша, только если не изменились инструкция и её входные файлы. COPY . . меняется при любой правке и инвалидирует все слои после него, включая npm ci. Если сначала скопировать только манифесты, слой с зависимостями пересобирается лишь при их изменении.

  • npm install не решает проблему кеша и делает сборку менее воспроизводимой.
  • --no-cache отключает кеш совсем, станет ещё медленнее.
  • Склейка RUN уменьшит число слоёв, но npm ci всё равно будет идти после COPY . ..

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.