在本文中,我们了解了在Docker容器中安装NVM的不同方法。我们可以在现有容器或新容器中安装NVM。或者,当我们想要自动化安装过程时,我们可以使用一个Dockerfile,其中包含所有配置的安装说明,以构建我们自己的镜像和容器。
Node Version Manager(NVM)是一个管理机器上多个Node.js版本的工具。
在本教程中,我们将学习如何在Docker容器中安装NVM。我们将讨论三种方法:
- 使用NVM Docker镜像,当Node.js是主要或唯一要使用的软件时
- 运行安装命令,用于在已有或新的Docker容器中安装时
- 从Dockerfile构建,用于自动化安装过程
1、使用NVM Docker镜像
我们可以从Docker Hub上提供的几个用于NVM的Docker中进行选择。让我们拉取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 --name node-nvm -it guolin/node-nvm-docker bash
|
这将在容器中启动一个Bash shell:
root@0787786b89f9:/#
NVM版本管理器预先安装在容器中;因此,我们可以直接确认其版本:
root@0787786b89f9:/# nvm --version 0.30.1
|
此外,Node.js也预装在容器中,所以让我们也验证一下这个版本:
root@0787786b89f9:/# nvm current v4.2.1
|
2.运行安装NVM的命令
我们可以通过运行一些命令在现有或新的Docker容器中安装NVM。
让我们启动一个交互式Ubuntu容器来安装NVM:
$ docker run -it --name ubuntu-demo ubuntu /bin/bash -c "echo 'Hello World'; /bin/bash"
|
这将在输出“Hello World”消息后启动一个交互式Bash shell:
root@8cc33fbb81e0:/#
首先,我们需要下载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 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 16631 100 16631 0 0 406k 0 --:--:-- --:--:-- --:--:-- 406k => Downloading nvm as script to '/root/.nvm' => Appending nvm source string to /root/.bashrc => Appending bash_completion source string to /root/.bashrc
|
我们可以关闭并重新打开终端以开始使用NVM。或者,让我们运行一个导出命令来加载NVM并开始使用它:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
加载NVM后,我们可以通过nvm命令找到它的用法:
root@8cc33fbb81e0:/# nvm Node Version Manager (v0.40.2) Usage: nvm --help Show this message nvm --version Print out the installed version of nvm
|
让我们使用它来安装和使用最新的Node版本:
root@8cc33fbb81e0:/# nvm install node Downloading and installing node v23.11.0... Downloading https://nodejs.org/dist/v23.11.0/node-v23.11.0-linux-x64.tar.gz... ###################################################################<strong>100.0%</strong> Computing checksum with sha256sum Checksums matched! Now using node v23.11.0 (npm v10.9.2)
|
然后,我们可以确认安装报告的Node版本:
root@8cc33fbb81e0:/# nvm current v23.11.0
|
有趣的是,即使Node尚未安装,我们也可以运行此命令。
3.从Dockerfile构建
当我们想要自动化安装过程时,也许最合适的选择是使用Dockerfile。我们将分三步来做:
- 创建Dockerfile
- 构建Docker镜像
- 运行Docker容器
(1)创建Dockerfile
我们可以将之前手动操作的大部分内容放在Dockerfile中:
FROM ubuntu:latest ARG NODE_VERSION=20 # install curl RUN apt update && apt install curl -y # install nvm RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash # set env ENV NVM_DIR=/root/.nvm # install node RUN bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION" # set ENTRYPOINT for reloading nvm-environment ENTRYPOINT ["bash", "-c", "source $NVM_DIR/nvm.sh && exec \"$@\"", "--"] # set cmd to bash CMD ["/bin/bash"]
|
我们可以看到,我们正在安装cURL,NVM和Node,就像以前一样到Ubuntu基础上。
(2)构建Docker镜像
现在,是时候从我们的Dockerfile构建Docker镜像了。为此,我们需要位于包含Dockerfile的目录中。
让我们运行一个docker build命令来创建一个名为nvm:latest的Docker镜像:
$ docker build -t nvm:latest .
|
docker images显示我们成功创建了它:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nvm latest 7383b5cdf243 6 minutes ago 345MB ubuntu latest 602eb6fb314b 2 days ago 78.1MB
|
(3)运行Docker容器
现在,我们可以构建一个容器,它很像我们之前从已经安装了Node.js和NVM的Docker Hub镜像构建的容器。
让我们从构建的镜像运行一个示例容器:
$ docker run --rm -it nvm root@c012e7d835d9:/#
|
现在,我们可以再次验证安装在Docker容器中的NVM,Node和NPM版本:
root@c012e7d835d9:/# nvm -v 0.40.2 root@c012e7d835d9:/# nvm current v20.19.0 root@c012e7d835d9:/# npm -v 10.8.2
|
但是,我们并不局限于Dockerfile中配置的版本。为了演示,让我们在同一个容器中安装一个新版本的Node:
root@c012e7d835d9:/# nvm install 23.11.0 Downloading and installing node v23.11.0... Downloading https://nodejs.org/dist/v23.11.0/node-v23.11.0-linux-x64.tar.gz... ###################################################################<strong>100.0%</strong> Computing checksum with sha256sum Checksums matched! Now using node v23.11.0 (npm v10.9.2)
|
我们可以使用nvm ls命令列出所有已安装的版本:
root@c012e7d835d9:/# root@c012e7d835d9:/# nvm ls v20.19.0 -> v23.11.0 default -> 20 (-> v20.19.0)
|
->表示活动节点版本。