ARG NODE_IMAGE=node:20-alpine FROM ${NODE_IMAGE} AS client-builder WORKDIR /app/client COPY client/package.json client/package-lock.json ./ RUN npm ci COPY client/ ./ RUN npm run build FROM ${NODE_IMAGE} AS server-deps WORKDIR /app/server COPY server/package.json server/package-lock.json ./ RUN npm ci --omit=dev FROM ${NODE_IMAGE} AS runtime WORKDIR /app ENV NODE_ENV=production ENV PORT=3000 ENV TZ=Asia/Shanghai COPY --from=server-deps /app/server/node_modules ./server/node_modules COPY server/ ./server/ COPY --from=client-builder /app/client/dist ./client/dist RUN mkdir -p /app/server/data EXPOSE 3000 CMD ["node", "server/index.js"]