如何在Docker容器中安装NVM

在本文中,我们了解了在Docker容器中安装NVM的不同方法。我们可以在现有容器或新容器中安装NVM。或者,当我们想要自动化安装过程时,我们可以使用一个Dockerfile,其中包含所有配置的安装说明,以构建我们自己的镜像和容器。

Node Version Manager(NVM)是一个管理机器上多个Node.js版本的工具。

在本教程中,我们将学习如何在Docker容器中安装NVM。我们将讨论三种方法:

  1. 使用NVM Docker镜像,当Node.js是主要或唯一要使用的软件时
  2. 运行安装命令,用于在已有或新的Docker容器中安装时
  3. 从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)

->表示活动节点版本。