diff --git a/example.dockerfile b/example.dockerfile new file mode 100644 index 0000000..8590f6c --- /dev/null +++ b/example.dockerfile @@ -0,0 +1,46 @@ +# 使用官方基础镜像,指定版本以提高可重复性 +FROM node:18-alpine AS builder + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV NODE_ENV=production \ + PORT=3000 + +# 安装构建依赖 +COPY package*.json ./ +RUN npm ci --only=production + +# 复制源代码 +COPY . . + +# 构建应用(如果是需要构建的项目) +# RUN npm run build + +# ========== 生产阶段 ========== +FROM node:18-alpine + +# 创建非root用户以提高安全性 +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 + +WORKDIR /app + +# 从构建阶段复制必要文件 +COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ +COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules +COPY --from=builder --chown=nodejs:nodejs /app ./ + +# 切换到非root用户 +USER nodejs + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD node -e "require('http').get('http://localhost:${PORT}/health', (r) => {if(r.statusCode !== 200) throw new Error()})" || exit 1 + +# 暴露端口 +EXPOSE 3000 + +# 启动命令 +CMD ["node", "server.js"] \ No newline at end of file