NextJS TS pnpm docker-compose 部署

13 min read
# ---- Base Node ----
FROM node:19-alpine AS base
WORKDIR /app

# Install pnpm
RUN npm install -g pnpm

# Copy package files and install dependencies
COPY package*.json ./
RUN pnpm install

# ---- Build ----
FROM base AS build
COPY . .
RUN npm run build

# ---- Production ----
FROM node:19-alpine AS production
WORKDIR /app

# Copy over the node_modules, etc from the build stage
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/.next ./.next
COPY --from=build /app/public ./public
COPY --from=build /app/package*.json ./
COPY --from=build /app/next.config.js ./next.config.js
# Expose the port the app will run on
EXPOSE 3000

# Start the application
CMD ["npm", "start"]

  1. 基础阶段(Base Stage):
    • 使用 node:19-alpine 作为基础镜像。Alpine Linux 是一个轻量级的 Linux 发行版,非常适合用于 Docker 容器。
    • 设置工作目录为 /app
    • 安装 pnpm,这是一种包管理工具,类似于 npm,但更高效。
    • 复制 package*.json 文件到工作目录,然后运行 pnpm install 安装依赖。
  2. 构建阶段(Build Stage):
    • 从基础阶段开始构建。
    • 复制所有源代码文件到工作目录。
    • 运行 npm run build 命令构建应用。这可能包括编译源代码、压缩资源等步骤,具体取决于项目配置。
  3. 生产阶段(Production Stage):
    • 再次使用 node:19-alpine 作为基础镜像。
    • 设置工作目录为 /app
    • 从构建阶段复制 node_modules.next 目录、public 目录和一些配置文件。这保证了生产环境中只包含构建和运行应用所需的文件和依赖。
    • 暴露端口 3000,这是应用将要运行的端口。
    • 使用 npm start 命令启动应用。

对应的 docker-compose.yaml

version: '3.6'

services:
  web:
    build: .
    ports:
      - "3000:3000"