Ich bin gerade dabei, ein neues Docker-Image zu erstellen, und ich möchte NVM installieren, damit ich NodeJS verwalten kann.
In den Dokumenten zur Installation von NVM wird erwähnt, dass Sie Ihre .bashrc-Datei als Quelle verwenden müssen, um NVM verwenden zu können.
Ich habe versucht, dies in einer Docker-Datei einzurichten, aber bisher schlägt das Erstellen mit dem Fehler fehl:
"bash: nvm: Befehl nicht gefunden"
Hier sind die relevanten Zeilen aus meiner Docker-Datei:
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"
Hier ist die Ausgabe vom Versuch zu bauen:
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
Ich bin ziemlich neu in Docker, daher fehlt mir möglicherweise etwas Grundlegendes zum Schreiben von Docker-Dateien, aber bisher hat mir all das Lesen, das ich gemacht habe, keine gute Lösung gezeigt.
Antworten:
Wenn Sie
RUN bash...
jedes Mal in einem separaten Prozess ausgeführt werden, wird nichts in der Umgebung festgelegt. So installiere ichnvm
:quelle
v0.20.0
v0.24.1
0.31.0
und node istv4.2.3
der Pfad/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
Quellbinärdatei vermeiden.Um allen zu helfen, die nach einer Möglichkeit suchen, Node.js mit NVM unter Ubuntu (letzte Version) zu installieren, habe ich die folgende Docker-Datei erstellt. Ich verwende die letzte Version von Docker, Ubuntu, Node.js und der NVM funktioniert ordnungsgemäß (der $ PATH wurde behoben). Ich verwende dies in einer Produktionsumgebung.
Docker-Datei:
quelle
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Die NVM-Pfade haben sich seit der akzeptierten Antwort geändert. Wenn Sie also eine aktuellere NVM-Version verwenden möchten, müssen Sie einige Änderungen vornehmen. Es ist auch nicht erforderlich, eine Neuzuordnung vorzunehmen
sh
, damit es funktioniert:Ich bin mir nicht sicher, ob Sie die
--delete-prefix
Option auf demnvm use
- ich habe es brauchen , aber das kann etwas Seltsames an meinem Basis-Image sein.quelle
Jedes
RUN
in einer Docker-Datei wird in einem anderen Container ausgeführt. Wenn Sie also eine Datei in einem Container als Quelle verwenden, ist ihr Inhalt im nächsten nicht verfügbar.Wenn Sie eine Anwendung installieren und mehrere Schritte ausführen müssen, müssen Sie dies daher im selben Container tun.
Mit Ihrem Beispiel:
quelle
RUN ["/bin/bash", ...]
. Es darf nicht von umgeben sein[...]
und Sie müssen den Interpreter nicht angeben/bin/bash -c
.Dies basiert auf der Top-Antwort und funktioniert im Jahr 2018:
Beachten Sie, dass dies
nvm
kein Bash-Befehl ist, sondern ein Alias. Dies kann Sie vermasseln, wenn Sie sich darauf verlassen$PATH
.quelle
Update 20/02/2020 : Diese Lösung funktioniert, wenn Sie ein
debian
Basis-Image verwenden. Wenn Sie verwendenubuntu
, lesen Sie diese Antwort .Hier ist der sauberste Weg zur Installation
nvm
, den ich gefunden habe:Erläuterung
In der ersten Zeile wird die Standard-Shell des Dockerfiles auf eine Bash-Login-Shell festgelegt . Hinweis: Dies bedeutet, dass jedes nachfolgende
RUN
,CMD
undENTRYPOINT
unter dem aktuellen Benutzer (normalerweise root) ausgeführt wird und die Datei ~ / .bashrc als Quelle verwendet wird, wenn sie in der Shell-Form ausgeführt wird .Die zweite Zeile wird
nvm
mit bash installiert . Wenn das Skript mit bash ausgeführt wird, wird es an die Datei ~ / .bashrc angehängt .In der dritten Zeile wird eine bestimmte Version von nodejs installiert und verwendet. Die
nvm
,npm
undnode
Befehle zur Verfügung , weil sie über ein Bash - Login - Shell ausgeführt werden (siehe Zeile 1).quelle
NVM_DIR
(wie in einigen anderen Antworten gezeigt) hat es für mich behoben.RUN
BefehlssätzeNVM_DIR
in~/.bashrc
.sh
und daher ignoriert.bashrc
. Sind Sie auch sicher, dass Sie.bashrc
wirklich eine Quelle haben, bevor SieRUN
Befehle ausführen ? Bei meinen kurzen Tests mit dem offiziellenbash
Bild schien es nicht so zu sein.SHELL
Anweisung) adressiert. Aufeinanderfolgende RUN-Befehle verwenden eine Anmeldeshell, die die.bashrc
Datei als Quelle verwendet. Hinweis: Dies funktioniert nur, wenn Befehle im Shell-Modus ausgeführt werden, z.RUN nvm --version
. Es funktioniert nicht, wenn Befehle im Exec-Modus ausgeführt werden, z.RUN ["nvm", "--version"]
. Ich habe den Link, den ich für das Shell-Formular bereitstelle, aktualisiert, um dies hoffentlich deutlicher zu machen.Basierend auf dem Vorschlag in der @ Kuhess-Antwort habe ich den Quellbefehl in meiner Docker-Datei durch den folgenden ersetzt
quelle
Hier ist meine Arbeitsversion
Hat Hilfe von @abdulljibali und @shamisis Antworten genommen.
quelle
~/.nvm/nvm.sh
Datei war der Schlüssel, den ich brauchte.Ich muss mit der Tatsache beginnen, dass ich überall gesucht habe, um ein funktionierendes Beispiel für das
nvm
Innere zu erhalten,docker
und keines gefunden habe. Auch die Antworten in diesem Thread haben nicht funktioniert.Also habe ich einige Zeit verbracht und mir eine ausgedacht, die funktioniert:
quelle
Ein wesentlicher Unterschied zwischen dem Versuch, den Befehl nvm zu erhalten, in der Frage:
was nicht funktioniert und der Versuch, dasselbe in der akzeptierten Antwort zu tun:
Ist das, dass die zweite Version das Skript nvm.sh direkt bezieht, während das Original versucht, dies über die .bashrc-Datei zu tun.
Die .bashrc-Datei enthält frühzeitig eine Zeile, die beendet wird, wenn sie in einer nicht interaktiven Shell ausgeführt wird:
Es kommt also nie zu dem Punkt, an dem es nvm.sh bezogen hätte, wodurch der Befehl nvm tatsächlich in Ihre Shell eingefügt wird.
Es würde mich nicht wundern, wenn Docker dieses Zeug in einer nicht interaktiven Shell ausführt. Darauf wurde nicht ausdrücklich hingewiesen, daher dachte ich, ich würde es erwähnen, da es mich auffiel, als ich etwas Ähnliches mit Vagabunden machte.
quelle
Ich habe ein oder zwei Stunden gebraucht, um herauszufinden, wie ich das am saubersten machen kann. --login scheint .bashrc nicht auszuführen, daher müssen Sie -i angeben, um es im interaktiven Modus zu starten. Dies führt dazu, dass Docker Sie ein wenig anschreit, sodass ich nur auf diese Weise für die Installation starte und dann auf meine Standard-Shell zurücksetze.
quelle
ubuntu
als Basis-Image funktioniert (aber Ihre). Ich habedebian
basierte Bilder verwendet. Ich bin mir nicht sicher, was die Diskrepanz zwischen den beiden verursacht. Irgendwelche Ideen?Nichts davon funktionierte für mich, für meinen
python3-onbuild
Container musste ich zwangsweise symbolische Links zur NVM-Installation erstellen.quelle
$HOME/.nvm
für mich.Das hat bei mir funktioniert (ich benutze Debian Buster):
Sie sollten jetzt in der Lage sein zu tun
nvm install <version>
.quelle
Mit nur einer Antwort wurde die Curl-Installation ausgeführt, es funktioniert jedoch nicht die gesamte Docker-Datei
Hier ist meine Docker-Datei zum Kopieren / Einfügen bereit, in der ich die neueste Version von nvm 2020 mit Ubuntu 18.04.3 LTS installiere
quelle