Вопрос проверяет понимание механизма кэширования слоёв в Docker и того, как порядок инструкций в Dockerfile влияет на эффективность сборки образа.
Каждая инструкция в Dockerfile (FROM, RUN, COPY и т.д.) создаёт новый слой образа. Docker кэширует эти слои: если инструкция и её контекст (например, содержимое копируемых файлов) не изменились с предыдущей сборки, используется кэшированный слой. Это значительно ускоряет повторные сборки.
Если изменить инструкцию, все последующие слои пересобираются, даже если их содержимое не менялось. Например, если сначала скопировать весь исходный код (COPY . .), а потом установить зависимости (RUN npm install), то при любом изменении кода придётся заново устанавливать все пакеты. Это неэффективно.
# Плохой порядок: копирование кода до установки зависимостей
FROM node:18
WORKDIR /app
COPY . . # меняется часто
RUN npm install # переустанавливается при каждом изменении кода
# Хороший порядок: зависимости кэшируются
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install # кэшируется, пока не изменятся package.json
COPY . . # копируется последним, не ломает кэш зависимостей
CMD ["npm", "start"]Правильный порядок инструкций в Dockerfile — ключевой приём оптимизации сборки. Размещайте редко изменяемые шаги (установка системных пакетов, зависимостей) в начале, а часто изменяемые (копирование исходного кода) — в конце. Это минимизирует время сборки и эффективно использует кэш Docker.