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.json
和yarn.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"