1. 概述
Node Version Manager(NVM)是一个用于在机器上管理多个 Node.js 版本的工具。
在本文中,我们将学习如何在 Docker 容器中安装 NVM。我们会介绍三种方法:
- 使用现成的 NVM Docker 镜像:适用于 Node.js 是容器中主要或唯一运行的软件
- 通过命令安装:适用于在已有的或新建的 Docker 容器中安装
- 通过 Dockerfile 构建镜像:适用于需要自动化安装流程的场景
2. 使用现成的 NVM Docker 镜像
我们可以从 Docker Hub 上选择几个现成的 NVM 镜像。以 guolin/node-nvm-docker
为例:
$ docker pull guolin/node-nvm-docker
查看本地镜像列表:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
guolin/node-nvm-docker latest 6dc6207658b5 8 years ago 703MB
然后以交互模式运行该镜像:
$ docker run -it --name node-nvm guolin/node-nvm-docker bash
进入容器后,可以直接验证 NVM 和 Node.js 的版本:
root@0787786b89f9:/# nvm --version
0.30.1
root@0787786b89f9:/# nvm current
v4.2.1
✅ 优点:简单快捷,适合快速测试或部署
❌ 缺点:镜像可能版本较旧,不够灵活
3. 在容器中手动安装 NVM
如果我们需要在一个已有的或新建的容器中安装 NVM,可以通过命令手动安装。
以 Ubuntu 容器为例,先启动一个交互式容器:
$ docker run -it --name ubuntu-demo ubuntu /bin/bash -c "echo 'Hello World'; /bin/bash"
接着安装 curl
:
root@8cc33fbb81e0:/# apt update && apt install curl -y
然后使用 curl
下载并安装 NVM:
root@8cc33fbb81e0:/# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
安装完成后,我们需要手动加载 NVM:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
然后即可安装 Node.js:
root@8cc33fbb81e0:/# nvm install node
验证安装结果:
root@8cc33fbb81e0:/# nvm current
v23.11.0
⚠️ 踩坑提醒:每次新打开一个 shell 时都需要重新 source
加载 nvm.sh,否则无法识别 nvm
命令
4. 通过 Dockerfile 构建镜像
如果我们希望将安装过程自动化,最推荐的方式是使用 Dockerfile 构建自定义镜像。
4.1 创建 Dockerfile
以下是一个完整的 Dockerfile 示例:
FROM ubuntu:latest
ARG NODE_VERSION=20
# 安装 curl
RUN apt update && apt install curl -y
# 安装 nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
# 设置环境变量
ENV NVM_DIR=/root/.nvm
# 安装指定版本的 Node.js
RUN bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION"
# 设置入口命令以加载 nvm 环境
ENTRYPOINT ["bash", "-c", "source $NVM_DIR/nvm.sh && exec \"$@\"", "--"]
# 默认命令
CMD ["/bin/bash"]
4.2 构建镜像
确保当前目录下有 Dockerfile,然后执行构建命令:
$ docker build -t nvm:latest .
查看构建结果:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvm latest 7383b5cdf243 6 minutes ago 345MB
ubuntu latest 602eb6fb314b 2 days ago 78.1MB
4.3 运行容器
运行构建好的容器:
$ docker run --rm -it nvm
root@c012e7d835d9:/#
验证安装:
root@c012e7d835d9:/# nvm -v
0.40.2
root@c012e7d835d9:/# nvm current
v20.19.0
root@c012e7d835d9:/# npm -v
10.8.2
也可以安装其他版本的 Node.js:
root@c012e7d835d9:/# nvm install 23.11.0
查看已安装版本:
root@c012e7d835d9:/# nvm ls
v20.19.0
-> v23.11.0
default -> 20 (-> v20.19.0)
✅ 优点:可复用、可定制、适合 CI/CD 流程
❌ 缺点:首次配置稍复杂,构建时间略长
5. 总结
我们介绍了三种在 Docker 容器中安装 NVM 的方式:
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
使用现成镜像 | 快速部署 | 简单快捷 | 灵活性差 |
手动执行命令 | 调试或临时使用 | 灵活 | 无法复用 |
Dockerfile 构建 | 自动化部署 | 可复用、标准化 | 初期配置稍复杂 |
根据项目需求选择合适的方法,可以更高效地管理 Node.js 版本和构建环境。
完整示例命令可在 GitHub 上找到。