Dockerfile 967 B

12345678910111213141516171819202122232425262728293031323334
  1. # 构建阶段
  2. FROM node:20-alpine AS builder
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制 package.json 和 pnpm-lock.yaml(如果有的话)
  6. COPY package.json pnpm-lock.yaml* ./
  7. # 安装 pnpm
  8. RUN npm install -g pnpm
  9. # 安装依赖
  10. RUN pnpm install --frozen-lockfile
  11. # 生产阶段
  12. FROM node:20-alpine AS production
  13. # 安装必要的系统依赖
  14. RUN apk add --no-cache dumb-init
  15. # 创建非 root 用户
  16. RUN addgroup -g 1001 -S nodejs && \
  17. adduser -S nodejs -u 1001
  18. # 设置工作目录
  19. WORKDIR /app
  20. # 从构建阶段复制依赖
  21. COPY --from=builder /app/node_modules ./node_modules
  22. # 复制应用代码
  23. COPY --chown=nodejs:nodejs . .
  24. # 切换到非 root 用户
  25. USER nodejs
  26. # 暴露端口(如果有需要)
  27. # EXPOSE 3000
  28. # 使用 dumb-init 处理信号
  29. ENTRYPOINT ["dumb-init", "--"]
  30. # 启动应用
  31. CMD ["node", "index.js"]
  32. # 健康检查
  33. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  34. CMD node -e "console.log('healthy')" || exit 1