web-dev-qa-db-fra.com

installer nvm dans docker

Je suis en train de créer une nouvelle image Docker et je souhaite installer NVM afin de pouvoir gérer nodejs.

En lisant les documents sur la façon d’installer NVM, ils indiquent que vous devez source votre fichier .bashrc pour pouvoir commencer à utiliser NVM.

J'ai essayé de mettre cela en place dans un fichier Dockerfile, mais jusqu'à présent, la construction échoue avec l'erreur suivante:

"bash: nvm: commande introuvable"

Voici les lignes pertinentes de mon 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"

Voici le résultat d'essayer de construire:

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 étant assez nouveau pour moi, il me manque peut-être quelque chose de fondamental pour écrire Dockerfiles, mais jusqu'à présent, toutes les lectures que j'ai effectuées ne m'ont pas montré de bonne solution.

Merci

82
David Ficociello

Quand vous RUN bash... chaque fois qu’il s’exécute dans un processus séparé, tout élément défini dans l’environnement n’est pas conservé. Voici comment j'ai installé 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
111
Abdullah Jibaly

Pour aider tous ceux qui recherchent un moyen d'installer Node.js avec NVM sur Ubuntu (dernière version), j'ai créé le fichier docker ci-dessous. J'utilise la dernière version de Docker, Ubuntu, Node.js et la NVM fonctionne correctement (le $ PATH a été corrigé). J'utilise ceci dans un environnement de production.

$ 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"]
24
danilodeveloper

Les chemins d'accès NVM ont changé depuis la réponse acceptée. Si vous souhaitez utiliser une version plus récente de NVM, vous devez effectuer quelques modifications. De plus, il n'est pas nécessaire de remapper sh pour que cela fonctionne:

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

Je ne sais pas si vous aurez besoin du --delete-prefix option sur le nvm use - Je l’ai fait, mais mon image de base est peut-être étrange.

20
Steve Campbell

Chaque RUN d'un fichier Docker est exécuté dans un conteneur différent. Donc, si vous sourcez un fichier dans un conteneur, son contenu ne sera pas disponible dans le prochain.

C'est pourquoi, lorsque vous installez une application et que vous devez effectuer plusieurs étapes, vous devez le faire dans le même conteneur.

Avec votre exemple:

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
17
Kuhess

Ceci est basé sur la première réponse et fonctionne en 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

Notez que nvm n'est pas une commande bash, c'est un alias. Cela peut vous bousiller si vous comptez sur $PATH.

13
rjurney

Voici ma version de travail

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;

A pris l'aide de @abdulljibali et @shamisis répond.

8
Tahir Rauf

Je dois commencer par le fait que j'ai cherché partout pour obtenir un exemple de travail de nvm à l'intérieur de docker et je n'en ai trouvé aucun. Même les réponses dans ce fil ne fonctionnaient pas.

J'ai donc passé pas mal de temps et j'en ai trouvé un qui fonctionne:

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

Remarquez comment j'ai installé nodejs via apt-get ainsi que. J'ai constaté que certains paquets ne sont pas installés dans docker à moins que cela ne soit fait.

6

Sur la base de la suggestion de @Kuhess answer, j'ai remplacé la commande source par la suivante dans mon fichier Docker

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

Une différence essentielle entre la tentative d'obtention de la commande nvm dans la question:

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

qui ne fonctionne pas et la tentative de faire la même chose dans la réponse acceptée:

source $NVM_DIR/nvm.sh

Est-ce que la deuxième version source le script nvm.sh directement, alors que l'original tente de le faire via le fichier .bashrc.

Le fichier .bashrc contient au début une ligne qui se termine si elle est exécutée dans un shell non interactif:

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

Donc, il n’arrive jamais au point où il aurait pu extraire nvm.sh, ce qui place la commande nvm dans votre shell.

Je ne serais pas surpris si docker exécute ces choses dans un shell non interactif. Cela n’avait pas été explicitement souligné, alors j’ai pensé que j’allais le mentionner car c’était ce qui m’avait surpris quand je faisais quelque chose de similaire avec vagant.

6
tobuslieven

Rien de tout cela n'a fonctionné pour moi, pour mon python3-onbuild conteneur J'ai dû créer de force des liens symboliques vers l'installation 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
3
Corey Cole

Voici le moyen le plus propre d'installer nvm que j'ai trouvé:

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

Explication

  • La première ligne définit le shell par défaut du fichier Dockerfile sur un shell de connexion bash . Remarque: cela signifie que chaque RUN, CMD et ENTRYPOINT ultérieurs seront exécutés sous l’utilisateur actuel (généralement root), et source le ~ /. bashrc fichier si exécuté sous la forme forme shell .

  • La deuxième ligne installe nvm avec bash. Lorsque le script est exécuté avec bash, il est ajouté au fichier ~/.bashrc.

  • La troisième ligne installe une version particulière de nodejs et l’utilise. Les commandes nvm, npm et node sont disponibles car elles sont exécutées via un shell de connexion bash (voir ligne 1).

0
Dominic Roy-Stang