From 0e7c9dd890088f1a033fae8cc1fc2fa66bcb43aa Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Thu, 19 Mar 2026 22:20:22 -0400 Subject: [PATCH] experimental smaller docker image --- Dockerfile | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 27346d1..da82b1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,40 @@ -FROM node:20-alpine - -WORKDIR /app - -# Required for Prisma on Alpine +FROM node:20-alpine AS base RUN apk add --no-cache openssl -# Install all deps (including devDeps for tsx worker runtime + build tooling) +# ── deps: install production deps only ─────────────────────────────────────── +FROM base AS deps +WORKDIR /app +COPY package*.json ./ +COPY prisma ./prisma +RUN npm ci --omit=dev && npm run postinstall + +# ── build: full install + compile ───────────────────────────────────────────── +FROM base AS builder +WORKDIR /app COPY package*.json ./ COPY prisma ./prisma RUN npm ci - -# Copy source COPY . . - -# Generate Prisma client and build Next.js (postinstall handles prisma generate) RUN npm run build +# ── runner: lean production image ───────────────────────────────────────────── +FROM base AS runner +WORKDIR /app ENV NODE_ENV=production + +# Prisma client + schema (needed at runtime for db push and queries) +COPY --from=deps /app/node_modules ./node_modules +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/public ./public +COPY --from=builder /app/package.json ./package.json +COPY --from=builder /app/next.config.mjs ./next.config.mjs +COPY --from=builder /app/prisma ./prisma +# Worker source (compiled to node_modules/.cache or run via tsx in prod) +COPY --from=builder /app/src/worker ./src/worker +COPY --from=builder /app/src/lib ./src/lib +COPY --from=builder /app/tsconfig.json ./tsconfig.json + EXPOSE 3000 -# Default: run web server. Worker container overrides this CMD. +# Default: web server. Worker container overrides CMD. CMD ["npm", "start"]