Skip to content

Next.js 部署

Next.js 可作为 Node.js 服务运行在容器中。使用 standalone 输出可以只保留服务运行所需的文件,减小生产镜像体积。

启用 standalone 输出

next.config.ts 中配置:

ts
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  output: 'standalone',
}

export default nextConfig

构建后会生成 .next/standalone/server.jspublic/.next/static/ 不会自动复制到 standalone 目录,需要在镜像中单独处理。

Dockerfile

在项目根目录创建 Dockerfile

dockerfile
FROM node:24-slim AS base

ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH

RUN corepack enable

WORKDIR /app

FROM base AS deps

COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

FROM base AS builder

COPY --from=deps /app/node_modules ./node_modules
COPY . .

RUN mkdir -p public
RUN pnpm build

FROM node:24-slim AS runner

WORKDIR /app

ENV NODE_ENV=production
ENV HOSTNAME=0.0.0.0
ENV PORT=3000

RUN mkdir .next && chown node:node .next

COPY --from=builder --chown=node:node /app/public ./public
COPY --from=builder --chown=node:node /app/.next/standalone ./
COPY --from=builder --chown=node:node /app/.next/static ./.next/static

USER node

EXPOSE 3000

CMD ["node", "server.js"]

运行阶段使用 Node.js 镜像自带的非 root 用户。.next 目录保持可写,以支持图片优化、ISR 和其他运行时缓存。

.dockerignore

bash
node_modules
.next
out
.git
.env*
*.log

环境变量

  • 普通服务端变量可在容器启动时注入。
  • NEXT_PUBLIC_ 变量会写入客户端构建产物,必须在 pnpm build 前提供。
  • 构建参数和客户端变量都不适合保存密钥。

需要构建期变量时,在构建阶段的 pnpm build 之前增加:

dockerfile
ARG NEXT_PUBLIC_API_BASE_URL
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL

Docker Compose

将项目代码放入部署目录并进入:

bash
mkdir -p ~/apps/next-app
cd ~/apps/next-app

创建 compose.yml

yaml
services:
  app:
    build:
      context: .
    image: next-app
    container_name: next-app
    restart: unless-stopped
    init: true
    env_file:
      - .env.production
    ports:
      - '3000:3000'

启动服务:

bash
docker compose up -d

部署注意事项

  • 对外提供服务时,建议在容器前配置 Nginx 等反向代理。
  • 单实例缓存默认保存在容器本地文件系统;容器重建后不会保留。
  • 多实例部署需要额外处理缓存共享、标签失效同步和部署版本一致性。
  • output: 'standalone' 是精简部署产物,不会将应用转换为静态站点。

参考

基于 MIT 许可发布