intermediate

Multi-stage сборки

Отделяйте build tooling от runtime-образов, чтобы production-контейнеры оставались меньше, безопаснее и проще для сканирования.

Multi-stage сборки выносят компиляторы, dev-зависимости, test tooling и source-only файлы из runtime-образа. Типичный Node-паттерн: build в одной стадии, в финальную копируются только `dist` и production `node_modules`.

					FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

FROM node:20-bookworm-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
USER node
CMD ["node", "dist/server.js"]
				

Согласуйте glibc/musl и архитектуру CPU между build и runtime при копировании native-модулей.

На интервью: размер образа, поверхность уязвимостей, воспроизводимые артефакты, совместимость native-модулей и когда базы build и runtime должны совпадать.

Типовые ошибки: `node_modules` между несовместимыми платформами; забытые миграции, статика или Prisma engines в финальной стадии.

Компромисс — меньший и безопаснее runtime против сложности сборки и дисциплины копирования между стадиями.

Чеклист:

  • Раздельные build и runtime стадии.
  • Копировать только нужный output.
  • Проверять совместимость native deps.
  • Тестировать финальный артефакт стадии в CI.