FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --only=production && \ npm cache clean --force FROM node:20-alpine AS client-builder WORKDIR /app COPY client/package.json ./ RUN npm install && npm cache clean --force COPY client/ ./ RUN npm run build FROM node:20-alpine WORKDIR /app RUN apk add --no-cache tzdata ca-certificates ENV TZ=Asia/Shanghai COPY --from=builder /app/node_modules ./node_modules COPY server.js . COPY --from=client-builder /app/dist ./client/dist EXPOSE 3000 CMD ["node", "server.js"]