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

22
.dockerignore Normal file
View File

@@ -0,0 +1,22 @@
# Build output & deps — recreated inside the image
.next
node_modules
# Source control
.git
.gitignore
# Local env files — never bake secrets into an image
.env
.env.*
!.env.example
# Editor / tooling
.claude
.vscode
*.log
npm-debug.log*
# OS noise
.DS_Store
Thumbs.db

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"]

View File

@@ -1,7 +1,8 @@
import type { NextConfig } from "next"; import type { NextConfig } from "next";
const nextConfig: NextConfig = { const nextConfig: NextConfig = {
/* config options here */ // Produces a self-contained server bundle in .next/standalone — required for Docker
output: "standalone",
}; };
export default nextConfig; export default nextConfig;