在docker中安装nvm

我正在build立一个新的Docker镜像,我正在寻找安装NVM,所以我可以pipe理nodejs。

阅读有关如何安装NVM的文档,他们提到您需要获取.bashrc文件才能开始使用NVM。

我试图在Dockerfile中设置这个,但到目前为止build设失败,错误:

“bash:nvm:找不到命令”

这里是我的Dockerfile的相关行:

ADD files/nvm_install.sh /root/ RUN chmod a+x /root/nvm_install.sh RUN bash -c "/root/nvm_install.sh" RUN bash -l -c "source /root/.bashrc" RUN cd /root RUN bash -l -c "nvm install 0.10.31" 

以下是试图构build的输出:

docker build -t nginx_dock。

 Step 0 : FROM ubuntu ---> 826544226fdc Step 1 : MAINTAINER dficociello ---> Using cache ---> da3bc340fbb3 Step 2 : RUN apt-get update ---> Using cache ---> 6b6b611feb4f Step 3 : RUN apt-get install nginx curl -y ---> Using cache ---> 159eb0b16d23 Step 4 : RUN touch /root/.bashrc ---> Using cache ---> 5e9e8216191b Step 5 : ADD files/nginx.conf /etc/nginx/ ---> Using cache ---> c4a4a11296a2 Step 6 : ADD files/nvm_install.sh /root/ ---> Using cache ---> b37cba2a18ca Step 7 : RUN chmod a+x /root/nvm_install.sh ---> Using cache ---> bb13e2a2893d Step 8 : RUN bash -c "/root/nvm_install.sh" ---> Using cache ---> 149b49a8fc71 Step 9 : RUN bash -l -c "source /root/.bashrc" ---> Running in 75f353ed0d53 ---> 0eae8eae7874 Removing intermediate container 75f353ed0d53 Step 10 : RUN cd /root ---> Running in feacbd998dd0 ---> 284293ef46b0 Removing intermediate container feacbd998dd0 Step 11 : RUN bash -l -c "nvm install 0.10.31" ---> Running in 388514d11067 bash: nvm: command not found 2014/09/17 13:15:11 The command [/bin/sh -c bash -l -c "nvm install 0.10.31"] returned a non-zero code: 127 

我对Docker相当陌生,所以我可能会错过编写Dockerfiles的基础知识,但到目前为止,我所做的所有阅读都没有给我一个很好的解决scheme。

谢谢

当你RUN bash...每次运行在一个单独的进程中,环境中设置的任何东西都不会被维护。 以下是我如何安装nvm

 # Replace shell with bash so we can source files RUN rm /bin/sh && ln -s /bin/bash /bin/sh # Set debconf to run non-interactively RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections # Install base dependencies RUN apt-get update && apt-get install -y -q --no-install-recommends \ apt-transport-https \ build-essential \ ca-certificates \ curl \ git \ libssl-dev \ python \ rsync \ software-properties-common \ wget \ && rm -rf /var/lib/apt/lists/* ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 0.10.33 # Install nvm with node and npm RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \ && . $NVM_DIR/nvm.sh \ && nvm install $NODE_VERSION \ && nvm alias default $NODE_VERSION \ && nvm use default ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules ENV PATH $NVM_DIR/v$NODE_VERSION/bin:$PATH 

为了帮助大家寻找一种方法在Ubuntu上安装使用NVM的Node.js(最新版本),我在下面做了dockerfile。 我使用的是Docker,Ubuntu,Node.js的最新版本,NVM正常工作($ PATH已经修复)。 我在生产环境中使用它。

 $ docker info \ Server Version: 1.9.1 Kernel Version: 4.1.13-boot2docker Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015 Node.js Version: stable 4.2.4 LTS Ubuntu Version: 14.04.3 

dockerfile:

 FROM ubuntu:14.04.3 # Replace shell with bash so we can source files RUN rm /bin/sh && ln -s /bin/bash /bin/sh # make sure apt is up to date RUN apt-get update --fix-missing RUN apt-get install -y curl RUN sudo apt-get install -y build-essential libssl-dev ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 4.2.4 # Install nvm with node and npm RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash \ && source $NVM_DIR/nvm.sh \ && nvm install $NODE_VERSION \ && nvm alias default $NODE_VERSION \ && nvm use default ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH RUN mkdir /usr/app RUN mkdir /usr/app/log WORKDIR /usr/app # log dir VOLUME /usr/app/log # Bundle app source COPY . /usr/app # Install app dependencies RUN npm install EXPOSE 3000 CMD ["node", "server.js"] 

Dockerfile中的每个RUN在不同的容器中执行。 因此,如果您在容器中input文件,则下一个文件的内容将不可用。

这就是为什么当你安装一个应用程序,你需要做几个步骤,你必须在同一个容器中。

用你的例子:

 ADD files/nvm_install.sh /root/ RUN chmod a+x /root/nvm_install.sh && \ /root/nvm_install.sh && \ source /root/.bashrc && \ cd /root && \ nvm install 0.10.31 

根据@Kuhess答案中的build议,我用我的Dockerfile中的以下内容replace了source命令

 RUN cat ~/.nvm/nvm.sh >> installnode.sh RUN echo "nvm install 0.10.35" >> installnode.sh RUN sh installnode.sh 

我必须从我search遍历来得到nvm一个工作例子的事实开始,但是我找不到。 即使在这个线程的答案没有工作。

所以,我花了很长时间,想出了一个有效的方法:

 # install dependencies RUN apt-get update && apt-get install -y \ curl \ npm \ nodejs \ git; # compatibility fix for node on ubuntu RUN ln -s /usr/bin/nodejs /usr/bin/node; # install nvm RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.24.1/install.sh | sh; # invoke nvm to install node RUN cp -f ~/.nvm/nvm.sh ~/.nvm/nvm-tmp.sh; \ echo "nvm install 0.12.2; nvm alias default 0.12.2" >> ~/.nvm/nvm-tmp.sh; \ sh ~/.nvm/nvm-tmp.sh; \ rm ~/.nvm/nvm-tmp.sh; 

注意我是如何通过apt-get安装nodejs 。 我发现有些软件包不能在docker里面安装,除非这样做。

这是我的工作版本

 FROM ubuntu:14.04 # Declare constants ENV NVM_VERSION v0.29.0 ENV NODE_VERSION v5.0.0 # Replace shell with bash so we can source files RUN rm /bin/sh && ln -s /bin/bash /bin/sh # Install pre-reqs RUN apt-get update RUN apt-get -y install curl build-essential # Install NVM RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash # Install NODE RUN source ~/.nvm/nvm.sh; \ nvm install $NODE_VERSION; \ nvm use --delete-prefix $NODE_VERSION; 

接受@abdulljibali和@shamisis的帮助。

尝试在问题中获得nvm命令的一个主要区别是:

 RUN bash -l -c "source /root/.bashrc" 

这不起作用,并试图在接受的答案中做同样的事情:

 source $NVM_DIR/nvm.sh 

第二个版本是直接发送nvm.sh脚本,而原始版本是通过.bashrc文件来完成的。

.bashrc文件早期有一行,如果在非交互式shell中运行,则会退出:

 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac 

所以它永远不会到达源自nvm.sh的位置,它实际上将nvm命令放在你的shell中。

如果docker在非交互式shell中运行这些东西,我不会感到惊讶。 这并没有明确指出,所以我想我会提到这一点,因为当我做与stream浪汉类似的事情时,这就是我发现的原因。

自接受的答案以来,Nvmpath发生了变化,所以如果您想使用更新的nvm版本,则需要进行一些更改。 另外,没有必要重新映射sh使其工作:

 ENV NVM_DIR /usr/local/nvm RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash ENV NODE_VERSION v7.9.0 RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION" ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules ENV PATH $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH 

不知道你是否需要在nvm use --delete-prefix选项 – 我做了,但这可能是我的基本形象奇怪。

Interesting Posts