通过nvm管理多版本node
在通过jenkins构建前端项目的时候,可能会碰到不同的前端项目使用不同的node,此时就需要切换版本来构建,如果服务器上安装了多个版本的node,nvm就是一个好用的node版本管理工具
nvm安装也有在线和离线的区别,在线安装需要执行脚本,并需要访问github,很大程度会出现网络超时的情况,在线安装可参考链接:
https://nvm.uihtm.com/doc/install.html
本例子演示为离线安装,因为我的服务器访问github不行,总是失败
nvm 本身只是一个 shell 脚本,离线安装的核心思路就是:
- 先把 nvm 仓库(或 nvm-windows 的发行包)拿到离线机器;
- 手动把 Node.js 二进制包 放到 nvm 指定的目录;
- 让 nvm 识别即可
1、首先下载nvm源码包和node二进制包,将这两个文件上传到服务器上,如下:
curl -L -o nvm-0.39.7.tar.gz https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.7.tar.gz
curl -L -o node-v10.24.1-linux-x64.tar.xz https://nodejs.org/dist/v10.24.1/node-v10.24.1-linux-x64.tar.xz
2、在服务器上安装 nvm,如下:
mkdir -p ~/.nvm //当前用户根目录下创建隐藏文件.nvm
tar -zxvf nvm-0.39.7.tar.gz -C ~/.nvm --strip-components=1
- –strip-components=1:参数的作用是解压的时候舍弃外层目录,直接把实际文件解压到.nvm下
加了参数就会把这些内容直接解压到.nvm下,不会包含nvm-0.39.7这个目录了

3、在环境变量文件/etc/profile或者~/.bashrc 中配置如下内容:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
source /etc/profile 或者 source ~/.bashrc
4、在nvm中配置node,如下:
mkdir -p ~/.nvm/versions/node //创建node目录,按照这个创建即可
tar -xf node-v10.24.1-linux-x64.tar.xz -C ~/.nvm/versions/node //解压到node路径
mv ~/.nvm/versions/node/node-v10.24.1-linux-x64 ~/.nvm/versions/node/v10.24.1 //注意:必须改为以v开头+版本号的形式命名

5、验证&切换,如下:
nvm ls //查看有哪些node版本
nvm use 10.24.1 //执行切换命令
node -v //查看当前使用的node版本

问题1: 在shell 脚本中执行nvm提示nvm command not found?
nvm 是交互式工具,只在「手动登录终端」生效,不在「shell 脚本」里生效,因此如果要在shell脚本中使用nvm ,需要在脚本中加载nvm,如下:
#!/bin/bash
# 加载 nvm(必须写!)
export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 下面才能用 nvm / node / npm
nvm ls
nvm use 16
node -v
npm install
npm run build
下面使用Dockerfile构建一个多版本node管理容器,如下:
# 使用官方 Ubuntu 基础镜像(选择 LTS 版本更稳定)
FROM ubuntu:22.04
# 设置维护者信息(可选)
LABEL maintainer="your-name@example.com"
# 设置环境变量
# 定义 NVM 版本(可根据需要修改)
ENV NVM_VERSION v0.39.7
# 定义要安装的 Node.js 版本(可根据需要修改)
ENV NODE_VERSION 20
# 设置 NVM 安装目录
ENV NVM_DIR /root/.nvm
# 配置镜像源(可选,加速国内下载)
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 更新系统并安装依赖工具
RUN apt-get update && apt-get install -y \
curl \
wget \
git \
ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装 NVM
RUN mkdir -p $NVM_DIR && \
# 下载并执行 NVM 安装脚本
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/$NVM_VERSION/install.sh | bash && \
# 加载 NVM 环境
. $NVM_DIR/nvm.sh && \
# 安装指定版本的 Node.js
nvm install $NODE_VERSION && \
nvm install 12.22.1 && \
nvm install 12.22.2 && \
nvm install 10.16.0 && \
nvm install 10.24.1 && \
nvm install 12.22.12 && \
nvm install 14.21.3 && \
nvm install 16.20.2 && \
nvm install 18.20.8 && \
nvm install 20.20.1 && \
nvm install 22.22.1 && \
nvm install 24.14.0 && \
# 设置默认 Node.js 版本
nvm alias default $NODE_VERSION && \
# 清理缓存减小镜像体积
nvm cache clear
# 配置环境变量,让容器启动时自动加载 NVM
RUN echo "" >> /etc/profile.d/nvm.sh && \
echo "# Load NVM" >> /root/.bashrc && \
echo "export NVM_DIR=\"$NVM_DIR\"" >> /etc/profile.d/nvm.sh && \
echo "[ -s \"$NVM_DIR/nvm.sh\" ] && \. \"$NVM_DIR/nvm.sh\"" >> /etc/profile.d/nvm.sh && \
echo "[ -s \"$NVM_DIR/bash_completion\" ] && \. \"$NVM_DIR/bash_completion\"" >> /etc/profile.d/nvm.sh
# 将 Node.js 可执行文件添加到系统 PATH(确保非交互式 shell 也能使用)
ENV PATH $NVM_DIR/versions/node/v$(nvm version default)/bin:$PATH
# 验证安装
#RUN node -v && npm -v && nvm -v
# 设置默认命令(进入交互式 shell)
CMD ["/bin/bash"]


