Эффективная последовательность команд в
Dockerfile позволяет использовать кэширование и сократить время сборки в разы. Мы научимся правильно разделять установку зависимостей и копирование исходного кода, чтобы не пересобирать проект «с нуля» при каждой правке текста. Это базовый навык DevOps для экономии ресурсов раннеров и времени разработчиков.Сначала создадим неоптимальный файл, который сбрасывает кэш при любом изменении в коде:
# Dockerfile-slow
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
При такой структуре изменение одного символа в коде заставит
npm install запускаться заново.Теперь оптимизируем шаги: сначала копируем только файлы манифестов, устанавливаем зависимости, а уже потом добавляем код:
# Dockerfile-fast
FROM node:18
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["node", "index.js"]
Теперь слой с тяжелыми зависимостями закэшируется и будет пересобираться только при правке
package.json.Проверим разницу в скорости сборки, запустив процесс повторно после небольшого изменения в файле проекта.
time docker build -t fast-app -f Dockerfile-fast .
# Ожидаемый результат: время сборки во второй раз составит доли секунды (CACHED).
Грамотная последовательность шагов это самый дешевый способ ускорить доставку кода. Используйте этот принцип не только в
Docker, но и в шагах GitHub Actions или GitLab CI, вынося самые тяжелые и редко меняющиеся операции в начало пайплайна. Всегда проверяйте логи сборки на наличие пометки «Using cache».➡️ DevOps Ready | #практика