Files
Edu/apps/student-portal/Dockerfile

69 lines
2.7 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 多阶段构建student-portal 生产镜像ai14P6 硬化)
# 用法docker build -t edu/student-portal:latest -f apps/student-portal/Dockerfile .
# 端口4001004 §1.2 强制 4 端 4000-4003
# ============ Stage 1: 构建 ============
FROM node:22-alpine AS builder
WORKDIR /app
# 启用 pnpm
RUN corepack enable && corepack prepare pnpm@9.12.0 --activate
# 构建参数:控制 MSW mock 是否启用(生产构建默认 disabled
# --build-arg NEXT_PUBLIC_API_MOCKING=disabled
ARG NEXT_PUBLIC_API_MOCKING=disabled
ENV NEXT_PUBLIC_API_MOCKING=${NEXT_PUBLIC_API_MOCKING}
# MF 默认关闭(独立壳模式)
ARG NEXT_PUBLIC_MF_ENABLED=false
ENV NEXT_PUBLIC_MF_ENABLED=${NEXT_PUBLIC_MF_ENABLED}
# GraphQL 端点
ARG NEXT_PUBLIC_GRAPHQL_ENDPOINT=/api/v1/student/graphql
ENV NEXT_PUBLIC_GRAPHQL_ENDPOINT=${NEXT_PUBLIC_GRAPHQL_ENDPOINT}
# 拷贝整个 workspace 配置 + 源码pnpm workspace 需要所有包的 package.json + 源码)
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./
COPY tsconfig.base.json ./
COPY apps/student-portal ./apps/student-portal
# 拷贝 workspace 共享包student-portal 的 transpilePackages 依赖)
COPY packages/contracts ./packages/contracts
COPY packages/hooks ./packages/hooks
COPY packages/ui-components ./packages/ui-components
COPY packages/ui-tokens ./packages/ui-tokens
COPY packages/shared-ts ./packages/shared-ts
# 安装依赖(含 devDependencies构建需要
RUN pnpm install --filter @edu/student-portal... --frozen-lockfile || pnpm install --filter @edu/student-portal...
# 构建生产产物(禁用 telemetry
ENV NEXT_TELEMETRY_DISABLED=1
RUN pnpm --filter @edu/student-portal run build
# ============ Stage 2: 运行时 ============
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=4001
# 非 root 用户运行
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
# 拷构建产物 + node_modules保留 workspace 目录结构以保持 pnpm 符号链接)
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/apps/student-portal/package.json ./apps/student-portal/package.json
COPY --from=builder /app/apps/student-portal/.next ./apps/student-portal/.next
COPY --from=builder /app/apps/student-portal/node_modules ./apps/student-portal/node_modules
COPY --from=builder /app/apps/student-portal/next.config.js ./apps/student-portal/next.config.js
WORKDIR /app/apps/student-portal
USER nextjs
EXPOSE 4001
# 健康检查liveness
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget --quiet --spider http://localhost:4001/api/health || exit 1
CMD ["node_modules/.bin/next", "start", "-p", "4001"]