# 使用 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"