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 上找到。


原始标题:How to Install NVM in a Docker Container