chore: upgrade Next.js and Node.js Docker image

This commit is contained in:
joshuafhiggins committed 2026-10-22 17:08:02 -04:00 Verified
1 parent 373dfaf76a
commit ceab537aa0
3 files changed
+648 -485

No files matched your search

+92 -33
View File
@@ -1,53 +1,112 @@
# syntax=docker/dockerfile:1 # ============================================
# Stage 1: Dependencies Installation Stage
# ============================================
FROM node:20-alpine AS base # IMPORTANT: Node.js Version Maintenance
# This Dockerfile uses Node.js 24.22.1-slim, which was the latest LTS version at the time of writing.
# To ensure security and compatibility, regularly update the NODE_VERSION ARG to the latest LTS version.
ARG NODE_VERSION=24.22.1-slim
# Install dependencies only when needed FROM node:${NODE_VERSION} AS dependencies
FROM base AS deps
RUN apk add --no-cache libc6-compat # Set working directory
WORKDIR /app WORKDIR /app
# Copy package files # Copy package-related files first to leverage Docker's caching mechanism
COPY package.json package-lock.json* ./ COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* pnpm-workspace.yaml* .npmrc* ./
# Install dependencies # Install project dependencies with frozen lockfile for reproducible builds
RUN npm ci RUN --mount=type=cache,target=/root/.npm \
--mount=type=cache,target=/usr/local/share/.cache/yarn \
--mount=type=cache,target=/root/.local/share/pnpm/store \
if [ -f package-lock.json ]; then \
npm ci --no-audit --no-fund; \
elif [ -f yarn.lock ]; then \
corepack enable yarn && yarn install --frozen-lockfile --production=false; \
elif [ -f pnpm-lock.yaml ]; then \
corepack enable pnpm && pnpm install --frozen-lockfile; \
else \
echo "No lockfile found." && exit 1; \
fi
# Rebuild the source code only when needed # ============================================
FROM base AS builder # Stage 2: Build Next.js application in standalone mode
# ============================================
FROM node:${NODE_VERSION} AS builder
# Set working directory
WORKDIR /app WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
# Copy project dependencies from dependencies stage
COPY --from=dependencies /app/node_modules ./node_modules
# Copy application source code
COPY . . COPY . .
# Build the application
RUN npm run build
# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production ENV NODE_ENV=production
# Create non-root user for security # Next.js collects completely anonymous telemetry data about general usage.
RUN addgroup --system --gid 1001 nodejs # Learn more here: https://nextjs.org/telemetry
RUN adduser --system --uid 1001 nextjs # Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED=1
# Copy public assets # Build Next.js application
COPY --from=builder /app/public ./public # If you want to speed up Docker rebuilds, you can cache the build artifacts
# by adding: --mount=type=cache,target=/app/.next/cache
# This caches the .next/cache directory across builds, but it also prevents
# .next/cache/fetch-cache from being included in the final image, meaning
# cached fetch responses from the build won't be available at runtime.
RUN if [ -f package-lock.json ]; then \
npm run build; \
elif [ -f yarn.lock ]; then \
corepack enable yarn && yarn build; \
elif [ -f pnpm-lock.yaml ]; then \
corepack enable pnpm && pnpm build; \
else \
echo "No lockfile found." && exit 1; \
fi
# Set the correct permission for prerender cache # ============================================
RUN mkdir .next # Stage 3: Run Next.js application
RUN chown nextjs:nodejs .next # ============================================
# Automatically leverage output traces to reduce image size FROM node:${NODE_VERSION} AS runner
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs # Set working directory
WORKDIR /app
EXPOSE 3000
# Set production environment variables
ENV NODE_ENV=production
ENV PORT=3000 ENV PORT=3000
ENV HOSTNAME="0.0.0.0" ENV HOSTNAME="0.0.0.0"
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the run time.
# ENV NEXT_TELEMETRY_DISABLED=1
# Copy production assets
COPY --from=builder --chown=node:node /app/public ./public
# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown node:node .next
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=node:node /app/.next/standalone ./
COPY --from=builder --chown=node:node /app/.next/static ./.next/static
# If you want to persist the fetch cache generated during the build so that
# cached responses are available immediately on startup, uncomment this line:
# COPY --from=builder --chown=node:node /app/.next/cache ./.next/cache
# Switch to non-root user for security best practices
USER node
# Expose port 3000 to allow HTTP traffic
EXPOSE 3000
# Start Next.js standalone server
CMD ["node", "server.js"] CMD ["node", "server.js"]
+554 -450
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -15,7 +15,7 @@
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"lucide-react": "^0.562.0", "lucide-react": "^0.562.0",
"next": "16.1.2", "next": "16.4.2",
"nodemailer": "^7.0.12", "nodemailer": "^7.0.12",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
@@ -28,7 +28,7 @@
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",
"eslint": "^9", "eslint": "^9",
"eslint-config-next": "16.1.2", "eslint-config-next": "16.4.2",
"tailwindcss": "^4", "tailwindcss": "^4",
"tw-animate-css": "^1.4.0", "tw-animate-css": "^1.4.0",
"typescript": "^5" "typescript": "^5"