|
|
@@ -0,0 +1,34 @@
|
|
|
+# 构建阶段
|
|
|
+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
|