Add Docker support with multi-stage build

Enable output: standalone in next.config.ts so Next.js produces a
self-contained server bundle in .next/standalone. Multi-stage Dockerfile
(deps -> builder -> runner) on node:20-alpine keeps the final image
minimal; app runs as a non-root user for security. .dockerignore
excludes node_modules, .next, .env files, and editor tooling.

To build and run:
  docker build -t portfolio .
  docker run -p 3000:3000 portfolio

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Baccar
2026-05-25 10:11:38 +04:00
parent debbb64f20
commit 801e78eb4e
3 changed files with 67 additions and 1 deletions

43
Dockerfile Normal file
View File

@@ -0,0 +1,43 @@
# syntax=docker/dockerfile:1
# ── Stage 1: install dependencies ─────────────────────────────────────────────
FROM node:20-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# ── Stage 2: build the app ────────────────────────────────────────────────────
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# ── Stage 3: production runner ────────────────────────────────────────────────
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
# Run as non-root for security
RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs
# Static assets
COPY --from=builder /app/public ./public
# Standalone server + compiled output (standalone mode bundles only what's needed)
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]