字节笔记本字节笔记本

Nextjs docker-compose部署方式

2024-01-10

该文档描述了使用Docker Compose和Dockerfile将Next.js应用部署到容器中的详细步骤,包括依赖安装、应用构建和运行阶段。

# 使用 node 的官方镜像作为基础镜像
FROM node:18-alpine AS base

# 安装依赖
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn config set registry 'https://registry.npmmirror.com/'
RUN yarn install

# 构建应用
FROM base AS builder
RUN apk update && apk add --no-cache git
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN yarn build

# 运行应用
FROM base AS runner
WORKDIR /app
RUN apk add proxychains-ng

# 复制构建结果到新的镜像层
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/.next/server ./.next/server

# 指定容器启动时执行的命令
CMD ["node", "/app/server.js"]

  • 基础阶段 (base):
    • FROM node:18-alpine AS base: 使用轻量级的 node:18-alpine 镜像作为基础镜像。这个阶段被标记为 base,后续阶段可以从这里继承。
  • 依赖阶段 (deps):
    • FROM base AS deps: 从 base 阶段开始构建 deps 阶段。
    • RUN apk add --no-cache libc6-compat: 安装 libc6-compat 库,有时候 Node.js 应用需要这个库来运行某些本地依赖。
    • WORKDIR /app: 设置工作目录为 /app
    • COPY package.json yarn.lock ./: 将 package.jsonyarn.lock 文件复制到容器中。
    • RUN yarn config set registry 'https://registry.npmmirror.com/': 设置 Yarn 包管理器使用的 NPM 镜像源。
    • RUN yarn install: 安装 Node.js 项目的依赖。
  • 构建阶段 (builder):
    • FROM base AS builder: 从 base 阶段开始构建 builder 阶段。
    • RUN apk update && apk add --no-cache git: 更新包管理器并安装 Git,可能是为了从 Git 仓库获取某些依赖。
    • ENV OPENAI_API_KEY="" GOOGLE_API_KEY="" CODE="": 设置环境变量。
    • WORKDIR /app: 设置工作目录。
    • COPY --from=deps /app/node_modules ./node_modules: 从 deps 阶段复制安装好的 Node.js 模块。
    • COPY . .: 复制当前目录的所有文件到工作目录。
    • RUN yarn build: 执行构建命令,如编译 TypeScript、打包资源等。
  • 运行阶段 (runner):
    • FROM base AS runner: 从 base 阶段开始构建 runner 阶段。
    • WORKDIR /app: 设置工作目录。
    • RUN apk add proxychains-ng: 安装 Proxychains-ng,用于代理网络请求。
    • ENV PROXY_URL="" OPENAI_API_KEY="" GOOGLE_API_KEY="" CODE="": 设置环境变量。
    • COPY --from=builder /app/public ./public 等:从 builder 阶段复制构建产物到工作目录。
    • EXPOSE 3000: 暴露 3000 端口。
    • CMD if [ -n "$PROXY_URL" ]; then ... fi: 根据是否设置了 PROXY_URL 环境变量来决定是否通过 Proxychains 启动 Node.js 服务器。
version: "3.9"
services:
  web:
    container_name: web
    build: .
    ports:
      - "3000:3000"