运行 Node.js 应用的服务器镜像(如 Docker 镜像或云服务器基础镜像)需预装以下核心依赖环境,具体取决于应用类型和部署方式。以下是分层、实用的推荐清单:
✅ 必需项(几乎所有 Node.js 应用都需要)
-
Node.js 运行时
- 版本:建议 LTS 版本(如
20.x或18.x),与项目engines.node字段匹配 - 包含
npm(或可选yarn/pnpm)包管理器 - ✅ 推荐方式:使用官方镜像(如
node:20-alpine、node:20-slim),避免手动编译安装
- 版本:建议 LTS 版本(如
-
基础系统工具(尤其在 Alpine/Debian Slim 镜像中需确认)
curl/wget(用于健康检查、下载脚本等)ca-certificates(HTTPS 证书信任,关键! 否则npm install或 API 调用会报 SSL 错误)tzdata(时区支持,避免日志时间错乱)bash或sh(脚本执行,Alpine 默认用ash,但部分脚本需bash)
-
运行用户与权限(安全最佳实践)
- 创建非 root 用户(如
node用户)并以该用户运行应用(Docker 中用USER node) - 避免
root运行 Node.js 进程(防止容器逃逸风险)
- 创建非 root 用户(如
| ✅ 常见可选依赖(按场景添加) | 场景 | 所需依赖 | 说明 |
|---|---|---|---|
编译原生模块(如 bcrypt, sqlite3, sharp) |
python3, make, g++(或 build-base in Alpine) |
⚠️ 生产镜像中应避免安装编译工具;推荐:构建阶段编译 → 多阶段构建 → 运行阶段仅含二进制产物(见下方最佳实践) | |
图像处理(sharp, gm) |
libvips-dev(Debian)或 vips-dev(Alpine) + glib 相关库 |
sharp 可通过 SHARP_IGNORE_GLOBAL_LIBVIPS=1 使用预编译二进制(推荐) |
|
| 数据库客户端 | libpq-dev(PostgreSQL)、libmysqlclient-dev(MySQL)等 |
大多数纯 JS 驱动(如 pg, mysql2)无需系统库;仅 C++ 驱动(如 oracledb)可能需要 Oracle Instant Client |
|
| 字体/渲染(如 Puppeteer、PDF 生成) | fonts-liberation, xvfb, ttf-dejavu, libnss3, libatk-bridge2.0-0 等 |
Puppeteer 推荐使用 puppeteer-core + 下载 Chromium 二进制(通过 PUPPETEER_DOWNLOAD_HOST 控制) |
|
| 国际化/字符编码 | locales, glibc(Alpine 默认用 musl,需 gcompat 或换 debian-slim) |
如需 full-icu 支持,可安装 node:20-slim + icu-data-full |
✅ 强烈推荐的生产就绪配置
-
✅ 多阶段构建(Docker):
# 构建阶段 FROM node:20 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 或 npm ci --include=dev(若需构建) COPY . . RUN npm run build # 如 TypeScript 编译、Webpack 打包 # 运行阶段(极简、安全) FROM node:20-alpine RUN apk add --no-cache ca-certificates tzdata && cp -r /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone WORKDIR /app COPY --from=builder /app/dist ./dist # 或 copy built files COPY --from=builder /app/node_modules ./node_modules USER node EXPOSE 3000 CMD ["node", "dist/index.js"] -
✅ 环境变量与配置
NODE_ENV=production(启用性能优化,跳过 dev-only 逻辑)CI=true(避免 npm 交互式提示)NPM_CONFIG_PRODUCTION=true(确保npm ci不安装 devDependencies)
❌ 应避免安装的(安全 & 体积考量)
git(除非运行时需动态 clone,否则应构建时完成)vim/nano(调试用,生产镜像不需)gcc/python等编译链(违反最小化原则;用多阶段构建替代)node-gyp(运行时不需要,仅构建时需)
📌 额外提醒
- 若使用 Serverless(如 AWS Lambda):依赖需打包进部署包,无系统级安装权,优先选纯 JS 库。
- 若使用 PM2/Nodemon:仅开发/调试需要,生产推荐直接
node或process manager(如 systemd、supervisord)。 - 日志:确保 stdout/stderr 输出(容器日志采集依赖此),避免重定向到文件。
如需,我可以为你定制一个针对特定框架(如 Express、NestJS、Next.js SSR)或数据库(PostgreSQL/MongoDB)的精简镜像配置示例。欢迎补充你的技术栈 😊
CLOUD云枢