Как работает кеш слоёв Docker и в каком порядке писать инструкции?
Dockerfile и образы
Каждая инструкция Dockerfile создаёт слой. Docker переиспользует слой из кеша, если инструкция и входные файлы не изменились, а при изменении пересобирает этот слой и все следующие.
Правило порядка
Редко меняющееся ставят выше, часто меняющееся ниже.
# плохо: любая правка кода сбрасывает установку зависимостей
COPY . .
RUN npm ci
# хорошо: зависимости ставятся из кеша, пока не менялся package.json
COPY package*.json ./
RUN npm ci
COPY . .Дополнительные приёмы
- Файл
.dockerignoreисключаетnode_modules,.git, логи и временные файлы из контекста сборки: сборка быстрее, а кеш не ломается лишними изменениями. - Объединять связанные команды в один
RUN, чтобы не создавать лишних слоёв и убирать кеш пакетного менеджера в той же команде. - Использовать кеш-монтирование BuildKit:
RUN --mount=type=cache,target=/root/.npm npm ci.
Коротко для собеседования
Порядок инструкций определяет эффективность кеша: сначала манифесты и установка зависимостей, потом исходники. .dockerignore обязателен.