intermediate
Dockerfile
Описывайте сборку образов упорядоченными инструкциями: base image, зависимости, исходники, пользователь, entrypoint и команды.
Dockerfile — код сборки. Порядок инструкций управляет кэшем и корректностью: сначала манифесты, установка по frozen lockfile, затем исходники, build и осознанный runtime user с командой.
FROM node:20-bookworm-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM deps AS build
COPY . .
RUN npm run build
FROM node:20-bookworm-slim AS runtime
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=deps /app/node_modules ./node_modules
USER node
CMD ["node", "dist/server.js"]
Используйте `.dockerignore` для `node_modules`, `.git`, тестов и локальных env-файлов. Предпочитайте `COPY` вместо `ADD`, если не нужна распаковка архивов.
На интервью: `COPY` vs `ADD`, `.dockerignore`, non-root, build args vs runtime env и разделение build-time и runtime конфигурации.
Типовые ошибки: копирование всего репозитория до `npm ci` ломает переиспользование кэша; секреты в `ARG` или слоях попадают в history образа.
Компромисс — скорость сборки (кэш слоёв) против ясности и безопасного отделения build-секретов от runtime-образов.
Чеклист:
- Порядок инструкций под корректный кэш.
- `.dockerignore` обязателен.
- Без секретов в слоях и build args.
- Production-процессы по возможности не от root.