Je suis en train de créer une nouvelle image Docker et je cherche à installer NVM afin de pouvoir gérer nodejs.
En lisant la documentation sur l'installation de NVM, ils mentionnent que vous devez vous procurer votre fichier .bashrc pour commencer à utiliser NVM.
J'ai essayé de configurer cela dans un Dockerfile, mais jusqu'à présent, la construction échoue avec l'erreur:
"bash: nvm: commande non trouvée"
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 de la tentative de construction:
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
Je suis assez nouveau dans Docker, donc il me manque peut-être quelque chose de fondamental dans l'écriture de Dockerfiles, mais jusqu'à présent, toutes les lectures que j'ai faites ne m'ont pas montré une bonne solution.
Réponses:
Lorsque vous exécutez à
RUN bash...
chaque fois un processus distinct, tout ce qui est défini dans l'environnement n'est pas conservé. Voici comment j'installenvm
:la source
v0.20.0
àv0.24.1
0.31.0
et nœud,v4.2.3
le chemin est/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
, en évitant le binaire source.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.
dockerfile:
la source
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Les chemins Nvm ont changé depuis la réponse acceptée, donc si vous souhaitez utiliser une version nvm plus à jour, vous devez apporter quelques modifications. En outre, il n'est pas nécessaire de remapper
sh
pour le faire fonctionner:Je ne sais pas si vous aurez besoin de l'
--delete-prefix
option sur lenvm use
- je l'ai fait, mais cela peut être quelque chose d'étrange dans mon image de base.la source
Chacun
RUN
dans un Dockerfile 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 suivant.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:
la source
RUN ["/bin/bash", ...]
. Il ne doit pas être entouré de[...]
et vous n'avez pas besoin de spécifier l'interprète/bin/bash -c
.Ceci est basé sur la meilleure réponse et fonctionne en 2018:
Notez que ce
nvm
n'est pas une commande bash, c'est un alias. Cela peut vous gâcher si vous comptez sur$PATH
.la source
Mise à jour du 20/02/2020 : Cette solution fonctionne si vous utilisez une
debian
image de base. Si vous utilisezubuntu
, consultez cette réponse .Voici le moyen le plus propre d'installer
nvm
que j'ai trouvé:Explication
La première ligne définit le shell par défaut du Dockerfile sur un shell de connexion bash . Note: cela signifie que chaque suite
RUN
,CMD
etENTRYPOINT
seront exécutés sous l'utilisateur actuel (généralement racine), et la source du ~ / .bashrc fichier si l' exécution en forme de coquille .La deuxième ligne s'installe
nvm
avec bash. Lorsque le script est exécuté avec bash, il s'ajoute au fichier ~ / .bashrc .La troisième ligne installe une version particulière de nodejs et l'utilise. Les
nvm
,npm
et lesnode
commandes sont disponibles car ils sont exécutés par un interpréteur de commandes bash (voir ligne 1).la source
NVM_DIR
(comme indiqué dans plusieurs des autres réponses) l'a corrigé pour moi.RUN
jeux de commandesNVM_DIR
dans~/.bashrc
.sh
et donc ignore.bashrc
. De plus, êtes-vous sûr que la.bashrc
source est vraiment fournie avant d'exécuter desRUN
commandes? Lors de mes brefs tests avec l'bash
image officielle , il me semblait que ce n'était pas le cas.SHELL
instruction) adresse. Il permet aux commandes RUN consécutives d'utiliser un shell de connexion qui source le.bashrc
fichier. Remarque: cela ne fonctionne que si les commandes sont exécutées en mode shell, par exemple.RUN nvm --version
. Cela ne fonctionnera pas si les commandes sont exécutées en mode exécution, par exemple.RUN ["nvm", "--version"]
. J'ai mis à jour le lien que je fournis pour le formulaire shell afin de rendre cela plus évident.Sur la base de la suggestion de la réponse @Kuhess, j'ai remplacé la commande source par ce qui suit dans mon Dockerfile
la source
Voici ma version de travail
J'ai pris l'aide des réponses @abdulljibali et @shamisis.
la source
~/.nvm/nvm.sh
fichier était la clé dont j'avais besoin.Je dois commencer par le fait que j'ai cherché partout pour obtenir un exemple fonctionnel de l'
nvm
intérieurdocker
et que je n'en ai trouvé aucun. Même les réponses dans ce fil n'ont pas fonctionné.Donc, j'ai passé un certain temps et en ai trouvé un qui fonctionne:
la source
Une différence clé entre la tentative d'obtenir la commande nvm dans la question:
qui ne fonctionne pas et la tentative de faire de même dans la réponse acceptée:
Est-ce que la deuxième version source directement le script nvm.sh, alors que l'original essaie de le faire via le fichier .bashrc.
Le fichier .bashrc contient une ligne au début qui se termine s'il est exécuté dans un shell non interactif:
Ainsi, il n'atteint jamais le point où il aurait provoqué nvm.sh qui place réellement la commande nvm dans votre shell.
Je ne serais pas surpris si docker exécute ce truc dans un shell non interactif. Cela n'avait pas été explicitement souligné, alors j'ai pensé que je le mentionnerais car c'est ce qui m'a surpris quand je faisais quelque chose de similaire avec vagrant.
la source
Il m'a fallu une heure ou deux pour trouver le moyen le plus propre de le faire. --login ne semble pas exécuter .bashrc donc vous devez fournir -i pour le lancer en mode interactif. Cela amène Docker à vous crier dessus pendant un moment, je ne lance donc que de cette façon pour l'installation, puis je réinitialise mon shell standard.
la source
ubuntu
tant qu'image de base (mais la vôtre le fait). J'utilisais desdebian
images basées. Je ne sais pas ce qui cause l'écart entre les deux. Des idées?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.la source
$HOME/.nvm
pour moi.C'est ce qui a fonctionné pour moi (j'utilise debian buster):
Vous devriez maintenant pouvoir le faire
nvm install <version>
.la source
Une seule réponse met l'installation curl mais ne fonctionne pas tout le Dockerfile
Voici mon Dockerfile prêt à copier / coller dans lequel j'installe la dernière version nvm 2020 avec Ubuntu 18.04.3 LTS
la source