|
1 | | -# ============================================================================ |
| 1 | +# ========================================== |
2 | 2 | # NEXT.JS DOCKERFILE.PROD - PRODUCTION (Highly Optimized) |
3 | | -# ============================================================================ |
| 3 | +# ========================================== |
4 | 4 | # Multi-stage production build for minimal size and best performance |
5 | | -# Image size: ~150MB (vs 500MB unoptimized) |
6 | | -# Build time: ~3-5 minutes with proper layer caching |
7 | | -# Security: Non-root user, immutable files, minimal dependencies |
8 | 5 |
|
9 | | -ARG NODE_VERSION=22-alpine |
| 6 | +# STAGE 1: Build |
| 7 | +FROM node:22-alpine AS build |
10 | 8 |
|
11 | | -# ============================================================================ |
12 | | -# STAGE 1: Dependencies Builder |
13 | | -# ============================================================================ |
14 | | -FROM node:${NODE_VERSION} AS deps |
| 9 | +# Install build dependencies |
| 10 | +RUN apk add --no-cache build-base gcc autoconf automake libc6-compat python3 > /dev/null 2>&1 |
15 | 11 |
|
16 | | -RUN npm install -g pnpm@10 --no-save |
| 12 | +WORKDIR /opt/ |
17 | 13 |
|
18 | | -WORKDIR /build |
| 14 | +# 1. Bật Corepack để kích hoạt pnpm ✅ |
| 15 | +RUN corepack enable && corepack prepare pnpm@10.0.0 --activate |
19 | 16 |
|
20 | | -# Copy dependency files (cache-optimized) |
| 17 | +# 2. Copy workspace config và package files ✅ |
21 | 18 | COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ |
22 | 19 | COPY next/package.json ./next/ |
23 | 20 | COPY strapi/package.json ./strapi/ |
24 | 21 |
|
25 | | -# Install all dependencies first |
| 22 | +# 3. Cài đặt toàn bộ dependencies (bao gồm dev deps để build) ✅ |
26 | 23 | RUN pnpm install --frozen-lockfile |
27 | 24 |
|
28 | | -# ============================================================================ |
29 | | -# STAGE 2: Builder - Build Next.js ✅ |
30 | | -# ============================================================================ |
31 | | -FROM node:${NODE_VERSION} AS builder |
32 | | - |
33 | | -RUN npm install -g pnpm@10 --no-save && \ |
34 | | - apk add --no-cache --virtual .build-deps \ |
35 | | - python3 \ |
36 | | - make \ |
37 | | - g++ \ |
38 | | - libc6-compat |
39 | | - |
40 | | -WORKDIR /build |
41 | | - |
42 | | -# Copy deps from stage 1 |
43 | | -COPY --from=deps /build/node_modules ./node_modules |
44 | | -COPY --from=deps /build/package.json . |
45 | | -COPY --from=deps /build/pnpm-lock.yaml . |
46 | | -COPY --from=deps /build/pnpm-workspace.yaml . |
47 | | - |
48 | | -# Copy source |
49 | | -COPY next ./next |
50 | | - |
51 | | -# Build Next.js app |
52 | | -RUN pnpm -C next build |
53 | | - |
54 | | -# ============================================================================ |
55 | | -# STAGE 3: Runtime - Minimal production image ✅ |
56 | | -# ============================================================================ |
57 | | -FROM node:${NODE_VERSION} |
58 | | - |
59 | | -LABEL maintainer="DevOps Team" |
60 | | -LABEL version="1.0" |
61 | | -LABEL description="Next.js Frontend - Production Optimized" |
62 | | - |
63 | | -# Install runtime dependencies only |
64 | | -RUN apk add --no-cache \ |
65 | | - curl \ |
66 | | - libc6-compat \ |
67 | | - ca-certificates && \ |
68 | | - rm -rf /var/cache/apk/* |
69 | | - |
70 | | -# Enable corepack to provide pnpm in runtime ✅ |
71 | | -RUN corepack enable && corepack prepare pnpm@10.0.0 --activate |
| 25 | +# 4. Copy source code và build dự án ✅ |
| 26 | +COPY . . |
| 27 | +RUN pnpm run build --filter nextjs |
| 28 | + |
| 29 | +# 5. Prune dev dependencies cho production mode ✅ |
| 30 | +RUN pnpm prune --prod |
| 31 | + |
| 32 | +# ========================================== |
| 33 | +# STAGE 2: Production Runtime |
| 34 | +# ========================================== |
| 35 | +FROM node:22-alpine |
72 | 36 |
|
73 | | -# Create non-root user |
74 | | -RUN addgroup -g 1001 -S nodejs && \ |
75 | | - adduser -S nodejs -u 1001 && \ |
76 | | - mkdir -p /app && \ |
77 | | - chown -R nodejs:nodejs /app |
| 37 | +# Install minimal runtime dependencies |
| 38 | +RUN apk add --no-cache libc6-compat curl bash ca-certificates > /dev/null 2>&1 |
78 | 39 |
|
79 | | -WORKDIR /app |
| 40 | +ARG NODE_ENV=production |
| 41 | +ENV NODE_ENV=${NODE_ENV} |
80 | 42 |
|
81 | | -# Copy built Next.js app |
82 | | -COPY --from=builder --chown=nodejs:nodejs /build/node_modules ./node_modules |
83 | | -COPY --from=builder --chown=nodejs:nodejs /build/package.json . |
84 | | -COPY --from=builder --chown=nodejs:nodejs /build/pnpm-lock.yaml . |
85 | | -COPY --from=builder --chown=nodejs:nodejs /build/next ./next |
| 43 | +WORKDIR /opt/ |
86 | 44 |
|
| 45 | +# 6. Bật Corepack ở stage runtime để chạy pnpm ✅ |
| 46 | +RUN corepack enable && corepack prepare pnpm@10.0.0 --activate |
| 47 | + |
| 48 | +# 7. Copy các file tối thiểu từ build stage ✅ |
| 49 | +# Chỉ copy node_modules đã prune và build artifacts |
| 50 | +COPY --from=build /opt/node_modules ./node_modules |
| 51 | +COPY --from=build /opt/package.json /opt/pnpm-lock.yaml /opt/pnpm-workspace.yaml /opt/ |
| 52 | +COPY --from=build /opt/next ./next |
| 53 | + |
| 54 | +WORKDIR /opt/app |
87 | 55 | # Set environment variables |
88 | 56 | ENV NODE_ENV=production |
89 | 57 | ENV NEXT_TELEMETRY_DISABLED=1 |
| 58 | +ENV PATH=/opt/node_modules/.bin:$PATH |
90 | 59 |
|
91 | | -# Switch to non-root user |
92 | | -USER nodejs |
| 60 | +# Ensure non-root node user |
| 61 | +RUN chown -R node:node /opt/ /opt/app |
| 62 | +USER node |
93 | 63 |
|
94 | 64 | EXPOSE 3000 |
95 | 65 |
|
96 | | -# Health check |
97 | | -HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ |
98 | | - CMD curl -f http://localhost:3000 || exit 1 |
99 | | - |
100 | | -# Start production server |
101 | | -CMD ["pnpm", "-C", "next", "start"] |
| 66 | +# 8. Start production server |
| 67 | +CMD ["pnpm", "-C", "next", "run", "start"] |
0 commit comments