From 87cc8994862202010377a6b3788138dfbdbc6e2d Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 21 Mar 2026 01:18:37 +0700 Subject: [PATCH] docker: fewer final image layers, npm cache mount, trim build context Made-with: Cursor --- .dockerignore | 1 + Dockerfile | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.dockerignore b/.dockerignore index 88f725b..8719877 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,6 +4,7 @@ data .git .github .cursor +eslint.config.js *.md !README.md .env diff --git a/Dockerfile b/Dockerfile index 6dd82a9..23b8a2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,36 @@ # syntax=docker/dockerfile:1 -FROM node:22-alpine AS builder +# Сборка фронта (devDependencies только здесь) +FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ -RUN npm ci +RUN --mount=type=cache,target=/root/.npm \ + npm ci && npm cache clean --force COPY index.html vite.config.js ./ COPY public ./public COPY src ./src RUN npm run build -FROM node:22-alpine AS runtime +# Production node_modules + server + dist +FROM node:22-alpine AS prod +WORKDIR /app +COPY package.json package-lock.json ./ +RUN --mount=type=cache,target=/root/.npm \ + npm ci --omit=dev && npm cache clean --force +COPY server ./server +COPY --from=build /app/dist ./dist + +# Слой приложения одним COPY в финальный образ (меньше слоёв в image) +FROM node:22-alpine AS bundle +WORKDIR /out +COPY --from=prod /app/node_modules ./node_modules +COPY --from=prod /app/server ./server +COPY --from=prod /app/dist ./dist +COPY --from=prod /app/package.json ./package.json + +FROM node:22-alpine WORKDIR /app ENV NODE_ENV=production -COPY package.json package-lock.json ./ -RUN npm ci --omit=dev -COPY server ./server -COPY --from=builder /app/dist ./dist +COPY --from=bundle /out/ . EXPOSE 3001 CMD ["node", "server/index.js"]