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.