# DoTouch.AI Web 容器镜像(Next.js standalone 多阶段构建) FROM node:22-alpine AS base RUN npm i -g pnpm@10 WORKDIR /app # 1. 依赖层 FROM base AS deps COPY pnpm-workspace.yaml package.json pnpm-lock.yaml .npmrc ./ COPY apps/web/package.json apps/web/package.json COPY packages/shared/package.json packages/shared/package.json RUN pnpm install --frozen-lockfile --filter @dotouch/web... --filter @dotouch/shared... # 2. 构建层 FROM deps AS build COPY . . RUN pnpm --filter @dotouch/shared build && pnpm --filter @dotouch/web build # 3. 运行层(standalone 最小产物) FROM node:22-alpine AS runner WORKDIR /app ENV NODE_ENV=production COPY --from=build /app/apps/web/.next/standalone ./ COPY --from=build /app/apps/web/.next/static ./apps/web/.next/static EXPOSE 3000 ENV PORT=3000 HOSTNAME=0.0.0.0 CMD ["node", "apps/web/server.js"]