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
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
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"]
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.
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
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
.
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.
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
viaapt-get
ainsi que. J'ai constaté que certains paquets ne sont pas installés dans docker à moins que cela ne soit fait.
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
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.
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
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
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).