在docker中安装nvm

时间:2014-09-17 20:37:13

标签: node.js docker nvm

我正在构建一个新的Docker镜像,我希望安装NVM,以便管理nodejs。

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

我试图在Dockerfile中设置它,但到目前为止构建失败并出现错误:

" 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"

以下是尝试构建的输出:

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的基本内容,但到目前为止,我所做的所有阅读都没有向我展示一个很好的解决方案。

谢谢

16 个答案:

答案 0 :(得分:109)

当您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 \
        wget \
    && rm -rf /var/lib/apt/lists/*

ENV NVM_DIR /usr/local/nvm # or ~/.nvm , depending
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

答案 1 :(得分:24)

为了帮助所有正在寻找在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"]

答案 2 :(得分:18)

自接受的答案以来,Nvm路径已发生变化,因此如果您想使用更新的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

不确定--delete-prefix上是否需要nvm use选项 - 我做过,但这对我的基本图片可能有点奇怪。

答案 3 :(得分:16)

Dockerfile中的每个RUN都在不同的容器中执行。因此,如果您在容器中提取文件,则其内容将无法在下一个文件中使用。

这就是为什么当您安装应用程序并且需要执行多个步骤时,必须在同一容器中执行此操作。

用你的例子:

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

答案 4 :(得分:12)

这是基于最佳答案的,并于2018年生效:

# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 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 \
        wget

ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 8.11.3

WORKDIR $NVM_DIR

RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \
    && . $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

请注意,nvm不是bash命令,它是别名。如果您依靠$PATH,这可能会使您不知所措。

答案 5 :(得分:10)

花一两个小时找出最干净的方法。 --login似乎没有执行.bashrc,因此您必须提供-i才能以交互方式启动它。这会导致Docker对您大吼大叫,因此我仅以这种方式启动安装,然后重置为我的标准Shell。

# Installing Node
SHELL ["/bin/bash", "--login", "-i", "-c"]
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
RUN source /root/.bashrc && nvm install 12.14.1
SHELL ["/bin/bash", "--login", "-c"]

答案 6 :(得分:8)

这是我的工作版

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的答案中获得帮助。

答案 7 :(得分:6)

根据@Kuhess回答中的建议,我在我的Dockerfile中用以下内容替换了source命令

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

答案 8 :(得分:6)

我必须从我搜索到nvm docker内部# 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; 的实际例子的事实开始,我没有找到。即使这个帖子中的答案也行不通。

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

nodejs
  

注意我也是如何通过apt-get安装{{1}}的。我发现有些软件包没有安装在docker中,除非这样做。

答案 9 :(得分:5)

在问题中尝试获取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中运行这些东西,我不会感到惊讶。这没有明确指出,所以我想我会提到它,因为当我和流浪汉做类似的事情时,是什么引起了我的注意。

答案 10 :(得分:3)

这些对我来说都不起作用,对于我的python3-onbuild容器,我必须强制创建nvm安装的符号链接。

# Install npm and nodejs
RUN apt-get install -y build-essential libssl-dev

RUN mkdir /root/.nvm
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 8.9.4

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.9/install.sh | bash
RUN chmod +x $HOME/.nvm/nvm.sh
RUN . $HOME/.nvm/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION && nvm use default && npm install -g npm

RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/nodejs
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm

答案 11 :(得分:2)

这是我发现的安装nvm的最干净的方法:

SHELL ["/bin/bash", "--login", "-c"]

RUN curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN nvm install 10.15.3 && nvm use 10.15.3

说明

  • 第一行将Dockerfile的默认外壳设置为 bash登录外壳。注意:这意味着随后的每个RUNCMDENTRYPOINT都将在当前用户(通常是root)下运行,并提供〜/ .bashrc 文件(如果在shell form中运行。

  • 第二行使用bash安装nvm。当脚本使用bash运行时,它将追加到〜/ .bashrc 文件。

  • 第三行安装特定版本的nodejs并使用它。 nvmnpmnode命令是可用的,因为它们是通过bash登录shell运行的(请参见第1行)。

答案 12 :(得分:2)

只有一个答案可以安装curl了,但不能使用整个Dockerfile

在这里,我的Dockerfile准备复制/粘贴,其中我安装了具有 Ubuntu 18.04.3 LTS

的最新 nvm 2020版本
FROM ubuntu

RUN apt-get update
RUN echo "y" | apt-get install curl
ENV NVM_DIR /usr/local/nvm
RUN mkdir -p /usr/local/nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
ENV NODE_VERSION v10
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

答案 13 :(得分:2)

2021 年 2 月 25 日 主要问题是使用 'source' 指令,这是特定于 bash shell 的。 对我有用的是用 '.' 替换 'source'。对于 Ubuntu 18 安装。 我的 Dockerfile:

FROM ubuntu:bionic

RUN \
  apt update && \
  apt upgrade -y && \
  apt install -y curl

ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 14.16

# Install nvm with node and npm
RUN curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh | bash \
  && . $NVM_DIR/nvm.sh \ 
  && nvm install $NODE_VERSION

答案 14 :(得分:1)

这对我有用(我正在使用debian buster):

RUN apt-get update
RUN apt-get install -y build-essential checkinstall libssl-dev
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.1/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"]

您现在应该可以执行nvm install <version>

答案 15 :(得分:1)

这会在扩展图像 "php:7.4.15" (debian:buster-slim) 时安装 nodejs 的 lts 版本:

# Install nvm to install npm and node.js
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION lts/*
RUN mkdir $HOME/.nvm && \
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash && \
    chmod +x $HOME/.nvm/nvm.sh && \
    . $HOME/.nvm/nvm.sh && \
    nvm install --latest-npm "$NODE_VERSION" && \
    nvm alias default "$NODE_VERSION" && \
    nvm use default && \
    DEFAULT_NODE_VERSION=$(nvm version default) && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/node /usr/bin/nodejs && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/node /usr/bin/node && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/npm /usr/bin/npm