casualroom/apps/fenghuo/docker/Dockerfile.web

76 lines
2.1 KiB
Docker
Executable File
Raw Permalink 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.

# Web应用多阶段构建Dockerfile
# 使用Alpine Linux减少镜像体积
# 阶段1: 基础镜像安装pnpm
FROM node:20-alpine AS base
RUN apk add --no-cache libc6-compat
RUN corepack enable && corepack prepare pnpm@9.12.3 --activate
# 设置npm中国镜像
RUN npm config set registry https://registry.npmmirror.com/
RUN pnpm config set registry https://registry.npmmirror.com/
# 设置Prisma中国镜像
ENV PRISMA_BINARIES_MIRROR=https://registry.npmmirror.com/-/binary/prisma/
WORKDIR /app
# 阶段2: 依赖安装
FROM base AS deps
# 复制依赖配置文件
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY turbo.json ./
COPY tsconfig.json ./
# 复制所有package.json文件
COPY apps/fenghuo/web/package.json ./apps/fenghuo/web/
COPY apps/fenghuo/api/package.json ./apps/fenghuo/api/
# 复制shared包的源代码工作空间依赖需要
COPY shared/ ./shared/
# 复制项目特有包
COPY apps/fenghuo/ ./apps/fenghuo/
# 安装所有依赖(包括开发依赖,因为构建时需要)
RUN pnpm install
# 阶段3: 构建阶段
FROM base AS builder
WORKDIR /app
# 从deps阶段复制node_modules
COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/apps/web/node_modules ./apps/web/node_modules
COPY --from=deps /app/apps/backend/node_modules ./apps/backend/node_modules
# 复制源代码包括backend源码因为web项目的tsconfig引用了它
COPY . .
# 构建web应用
RUN pnpm turbo build --filter=web
# 阶段4: 运行时镜像
FROM node:20-alpine AS runner
WORKDIR /app
# 创建非root用户
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# 复制必要的文件
COPY --from=builder /app/apps/web/public ./apps/web/public
COPY --from=builder /app/apps/web/package.json ./apps/web/package.json
# 复制构建产物
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
# 设置环境变量
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3000
USER nextjs
EXPOSE 3000
# 启动应用
CMD ["node", "apps/web/server.js"]