How to install nvm in docker?

后端 未结 14 937
陌清茗
陌清茗 2020-12-04 05:53

I am in the process of building a new Docker image and I\'m looking to get NVM installed so I can manage nodejs.

Reading the docs on how to install NVM they mention

相关标签:
14条回答
  • 2020-12-04 06:35

    Nvm paths have changed since the accepted answer, so if you want to use a more up-to-date nvm version, you need to make a few changes. Also, it is not necessary to remap sh to make it work:

    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
    

    Not sure if you will need the --delete-prefix option on the nvm use - I did, but that may be something strange about my base image.

    0 讨论(0)
  • 2020-12-04 06:35

    A key difference between the attempt to get the nvm command in the question:

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

    which doesn't work and the attempt to do the same in the accepted answer:

    source $NVM_DIR/nvm.sh
    

    Is that the second version sources the nvm.sh script directly, whereas the original tries to do it via the .bashrc file.

    The .bashrc file has a line in it early on which exits if it's being run in a non interactive shell:

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

    So it never gets to the bit where it would have sourced nvm.sh which actually puts the nvm command in your shell.

    I wouldn't be surprised if docker is running this stuff in a non interactive shell. This hadn't been explicitly pointed out, so I thought I would mention it as it's what caught me out when I was doing something similar with vagrant.

    0 讨论(0)
  • 2020-12-04 06:41

    Took me an hour or two to figure out the cleanest way to do it. --login doesn't seem to execute .bashrc so you have to supply -i to launch it in interactive mode. This causes Docker to yell at you for a bit so I only launch this way for the installation, then reset to my standard 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"]
    
    0 讨论(0)
  • 2020-12-04 06:45

    I must begin with the fact that I searched all over to get a working example of nvm inside docker and I found none. Even the answers in this thread did not work.

    So, I spent quite some time and came up with one that works:

    # 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;
    

    Notice how I have installed nodejs via apt-get as well. I found that some packages don't get installed inside docker unless this is done.

    0 讨论(0)
  • 2020-12-04 06:46

    Just one answer put the curl installation but does not work the entire Dockerfile

    Here my Dockerfile ready to copy/paste in which I install latest nvm 2020 version with Ubuntu 18.04.3 LTS

    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
    
    0 讨论(0)
  • 2020-12-04 06:47

    To help everyone that are looking for a way to install the Node.js with NVM on Ubuntu (last version), I made the dockerfile below. I'm using the last version of Docker, Ubuntu, Node.js and the NVM is working properly (the $PATH was fixed). I'm using this in a production environment.

    $ 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 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"]
    
    0 讨论(0)
提交回复
热议问题