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