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.