如何在Dockerfile中安装nvm?

12

我正试图在Dockerfile中安装nvm。看起来它已经成功安装了,但nvm命令无法运行。

Dockerfile:

I'm trying to install nvm within a Dockerfile. It seems like it installs OK, but the nvm command is not working.

# Install nvm
RUN git clone http://github.com/creationix/nvm.git /root/.nvm;
RUN chmod -R 777 /root/.nvm/;
RUN sh /root/.nvm/install.sh;
RUN export NVM_DIR="$HOME/.nvm";
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc;
RUN nvm ls-remote;

构建输出:

Step 23/39 : RUN git clone http://github.com/creationix/nvm.git /root/.nvm;
 ---> Running in ca485a68b9aa
Cloning into '/root/.nvm'...
 ---> a6f61d486443
Removing intermediate container ca485a68b9aa
Step 24/39 : RUN chmod -R 777 /root/.nvm/
 ---> Running in 6d4432926745
 ---> 30e7efc5bd41
Removing intermediate container 6d4432926745
Step 25/39 : RUN sh /root/.nvm/install.sh;
 ---> Running in 79b517430285
=> Downloading nvm from git to '$HOME/.nvm'
=> Cloning into '$HOME/.nvm'...
* (HEAD detached at v0.33.0)
  master
=> Compressing and cleaning up git repository

=> Appending nvm source string to /root/.profile
=> bash_completion source string already in /root/.profile
npm info it worked if it ends with ok
npm info using npm@3.10.10
npm info using node@v6.9.5
npm info ok
=> Installing Node.js version 6.9.5
Downloading and installing node v6.9.5...
Downloading https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v6.9.5 (npm v3.10.10)
Creating default alias: default -> 6.9.5 (-> v6.9.5 *)
/root/.nvm/install.sh: 136: [: v6.9.5: unexpected operator
Failed to install Node.js 6.9.5
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
 ---> 9f6f3e74cd19
Removing intermediate container 79b517430285
Step 26/39 : RUN export NVM_DIR="$HOME/.nvm";
 ---> Running in 1d768138e3d5
 ---> 8039dfb4311c
Removing intermediate container 1d768138e3d5
Step 27/39 : RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc;
 ---> Running in d91126b7de62
 ---> 52313e09866e
Removing intermediate container d91126b7de62
Step 28/39 : RUN nvm ls-remote;
 ---> Running in f13c1ed42b3a
/bin/sh: 1: nvm: not found
The command '/bin/sh -c nvm ls-remote;' returned a non-zero code: 127

错误:

Step 28/39 : RUN nvm ls-remote;
 ---> Running in f13c1ed42b3a
/bin/sh: 1: nvm: not found
The command '/bin/sh -c nvm ls-remote;' returned a non-zero code: 127

我的/root/.bashrc文件的结尾看起来像:

[[ -s /root/.nvm/nvm.sh ]] && . /root/.nvm/nvm.sh

其他所有的Dockerfile都可以正常工作,添加nvm的内容才导致它出了故障。这里是完整的文件。


3
可以请提供一个可行的Dockerfile(如果可能,包括您的基础镜像),以便我们可以复现并提供帮助。 - user926721
1
@BretFisher 在这种情况下,软件替代方案不是选项。 - CR47
1
你的dockerfile中不能有多个CMD。 - Bret Fisher
1
你安装了Node,然后想要安装nvm?你需要两个版本的Node吗? - Bret Fisher
1
最后,你可能想要做的是拆分这个Dockerfile。你至少需要一个用于PHP应用程序和一个用于数据库。然后,您可以使用它们各自的官方仓库进行构建。使用docker-compose将它们启动/链接在一起。 - Bret Fisher
显示剩余7条评论
2个回答

13
我对您的Dockerfile进行了以下更改,以使其正常工作:
首先,替换...
RUN sh /root/.nvm/install.sh;

...with:

RUN bash /root/.nvm/install.sh;

为什么?在基于Redhat的系统上,/bin/sh是指向/bin/bash的符号链接。但在Ubuntu上,/bin/sh是指向/bin/dash的符号链接。这就是使用dash时发生的情况:
root@52d54205a137:/# bash -c '[ 1 == 1 ] && echo yes!'
yes!
root@52d54205a137:/# dash -c '[ 1 == 1 ] && echo yes!'
dash: 1: [: 1: unexpected operator

其次,替换...

RUN nvm ls-remote;

...with:

RUN bash -i -c 'nvm ls-remote';

为什么?因为Ubuntu中用户的默认.bashrc文件(几乎在顶部)包含以下内容:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return

nvm脚本的源文件加载在底部。因此,我们需要通过传递参数-i来确保交互式地调用bash。

第三,您可以在Dockerfile中跳过以下行:

RUN export NVM_DIR="$HOME/.nvm";
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc;

为什么呢?因为 bash /root/.nvm/install.sh; 会自动为你完成:

[fedora@myhost ~]$ sudo docker run --rm -it 2a283d6e2173 tail -2 /root/.bashrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

2
在Dockerfile中安装nvm在Ubuntu 20.04上非常简单,您只需要使用以下命令即可完成安装。
FROM ubuntu:20.04
RUN apt update -y &&  apt upgrade -y && apt install wget bash -y

RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

RUN bash -i -c 'nvm ls-remote'

希望这能够起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接