Docker'da nvm nasıl kurulur?


103

Yeni bir Docker görüntüsü oluşturma sürecindeyim ve nodej'leri yönetebilmek için NVM'yi kurmayı düşünüyorum.

NVM'nin nasıl kurulacağına ilişkin belgeleri okurken, NVM'yi kullanmaya başlamak için .bashrc dosyanızı kaynak olarak almanız gerektiğini belirtiyorlar.

Bunu bir Dockerfile'da kurmayı denedim, ancak şu ana kadar derleme şu hatayla başarısız oldu:

"bash: nvm: komut bulunamadı"

İşte Dockerfile'ımdaki ilgili satırlar:

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"

İşte oluşturmaya çalışmanın sonucu:

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'da oldukça yeniyim, bu yüzden Dockerfiles yazmak için temel bir şeyi kaçırıyor olabilirim, ancak şimdiye kadar yaptığım tüm okumalar bana iyi bir çözüm göstermedi.


11
Değil bu kadar yinelenen bir liman işçisi içine yüklemeden özellikle olup standart yüklemek
David Ficociello

Düğümün yalnızca tek bir sürümünü kurduğunuz için, nvm'yi yüklemek gereksiz görünüyor. Docker düğüm deposu tarafından sağlanan Dockerfiles, düğümün nasıl kurulacağına dair bir referans olarak kullanılabilir.
mikwat

Yanıtlar:


121

Ne zaman RUN bash...ayrı bir işlemde çalışır, çevrede şey seti muhafaza olmadığını her seferinde. İşte nasıl kurduğum 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

hıza bunun kadar iki kez sadece değiştirmek de v0.20.0hiçv0.24.1
itsnikolay

8
nvm 0.31.0ve düğüm v4.2.3ile yol/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu

4
@thiagoh Bu, soruyu soran kişinin nvm yüklemesinin neden çalışmadığını ve çalışan yanıtların işe yaradığını açıklamıyor. Ayrı işlemlerde çalışan kabuklarla hiçbir ilgisi yoktur. Bunun nedeni, sorunun nvm komutunu bash'a yükleyen nvm.sh dosyasını yüklemek için bash.rc'yi kaynaklamaya çalışması, ancak etkileşimli olmayan çalıştırıldığında bash.rc'nin erken çıkması, dolayısıyla nvm komutu yüklenmemesidir. Tüm başarılı cevaplar nvm.sh'yi bash.rc. aracılığıyla yapmak yerine doğrudan kaynak olarak alır. Bu, bu işi yapmanın anahtarıdır.
tobuslieven

2
Sh'yi bash ile değiştirmek yerine, . $NVM_DIR/nvm.shkaynak ikilisinden kaçınarak yapabilirsiniz .
Razvan Grigore

3
Bu yakın, ama yolları, olması gereken bir biraz ayarlama yapılması gerekmektedir: ENV NODE_PATH $ NVM_DIR / versiyonları / düğüm / v $ NODE_VERSION / lib / ENV YOLU $ NVM_DIR / versiyonları / düğüm / v $ NODE_VERSION / bin node_modules: $ PATH
Lunulata

31

NVM ile Node.js'yi Ubuntu'ya (son sürüm) kurmanın bir yolunu arayan herkese yardımcı olmak için aşağıdaki dockerfile'ı yaptım. Docker, Ubuntu, Node.js'nin son sürümünü kullanıyorum ve NVM düzgün çalışıyor ($ PATH düzeltildi). Bunu bir üretim ortamında kullanıyorum.

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

1
NODE_PATH, ENV NODE_PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / lib / node_modules
Sentient

Merhaba @Sentient! Bu docker'ı bir üretim ortamında (ubuntu) ve yerel geliştiricide (OSX) çalıştırıyorum, her ikisi de hatasız ve düzgün çalışıyor. Güncel olmayan bir NVM kullanıyor olabilirsiniz?
danilodeveloper

SUDO'yu build-essential ve libssl-dev kurarken kullanmamın bir nedeni var mı? Ben hiç tecrübeli bir DevOps değilim.
a.barbieri

1
Önemli olansource $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea

24

Nvm yolları kabul edilen cevaptan bu yana değişti, bu nedenle daha güncel bir nvm sürümü kullanmak istiyorsanız, birkaç değişiklik yapmanız gerekir. Ayrıca, shçalışması için yeniden eşleştirmek gerekli değildir :

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

--delete-prefixSeçeneğindeki seçeneğe ihtiyacınız olup olmayacağından emin değilim nvm use- yaptım, ancak bu benim temel resmimle ilgili garip bir şey olabilir.


1
Hayat kurtarıcı! Keşke cevabınızı 3 saat önce görmüş olsaydım.
Adrian Marinica

Benim için çalıştı, temel resim php: 7.1.1
Toby Mellor

18

RUNDockerfile'daki her biri farklı bir konteynerde yürütülür. Bu nedenle, bir kapsayıcıdaki bir dosyanın kaynağı olursanız, içeriği bir sonraki dosyada kullanılamayacaktır.

Bu nedenle, bir uygulama yüklediğinizde ve birkaç adım atmanız gerektiğinde, bunu aynı konteyner içinde yapmanız gerekir.

Örneğinizle:

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

Tamam, açıklama için çok teşekkür ederim. Betiğimi şöyle görünecek şekilde değiştirdim: "ubuntu MAINTAINER dficociello ADD dosyaları / nvm_install.sh / root / # Install nvm RUN [" / bin / bash "," -c "," rm -f / etc / nginx / nginx.conf && touch /root/.bashrc && apt-get update && apt-get install nginx curl -y && chmod a + x /root/nvm_install.sh && source /root/.bashrc && / root / nvm_install. sh && nvm install 0.10.31 "] ADD dosyaları / nginx.conf / etc / nginx / EXPOSE 22` Şu hatayı alıyorum: `/ bin / bash: /root/nvm_install.sh: / bin / bash: bozuk yorumlayıcı: Metin dosyası meşgul ''
David Ficociello

Bu hata hattınıza bağlanmalıdır RUN ["/bin/bash", ...]. Çevresinde olmamalıdır [...]ve tercümanı belirtmenize gerek yoktur /bin/bash -c.
Kuhess

17

Bu, en iyi cevaba dayanmaktadır ve 2018'de çalışır:

# 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

Bunun nvmbir bash komutu olmadığını, bir takma ad olduğunu unutmayın. Eğer güveniyorsan bu seni mahvedebilir $PATH.


15

Güncelleme 20/02/2020 : Bu çözüm, bir debiantemel görüntü kullanıyorsanız çalışır . Eğer kullanıyorsanız ubuntu, bu yanıta bakın .

İşte nvmbulduğum en temiz kurulum yolu :

SHELL ["/bin/bash", "--login", "-c"]

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN nvm install 10.15.3

Açıklama

  • İlk satır, Dockerfile'ın varsayılan kabuğunu bir bash oturum açma kabuğuna ayarlar . Not: her sonraki bu araçlar RUN, CMDve ENTRYPOINTgeçerli kullanıcı (genellikle kök) altında çalışır ve kaynak olacaktır ~ / Bashrc dosya eğer çalıştırma kabuk formunda .

  • İkinci satır nvmbash ile kurulur . Komut dosyası bash ile çalıştırıldığında ~ / .bashrc dosyasına eklenir .

  • Üçüncü satır, nodejs'nin belirli bir sürümünü kurar ve onu kullanır. nvm, npmVe nodebir darbe giriş kabuğu (hat 1 e bakınız) üzerinden çalıştırılır, çünkü komutlar kullanılabilir.


1
Çok teşekkür ederim !
Gaui

Bunun senin için işe yaraması ilginç. Benzer bir şey denedim ve derlemeler sırasında her şey iyi görünüyordu, ancak ortaya çıkan görüntüyü çalıştırmaya gittiğimde NPM bulunamadı. Açıkça ayarlamak NVM_DIR(diğer cevapların birçoğunda gösterildiği gibi) benim için düzeltildi.
esmail

1
@ esmail garip çünkü ilk RUN komut setleri NVM_DIRiçinde ~/.bashrc.
Dominic Roy-Stang

1
@ DominicRoy-Stang, geçerli nokta. Üzerinde çalıştığım imaj kullanıyor shve bu yüzden görmezden geliyor .bashrc. Ayrıca emin misin.bashrcRUN komutları çalıştırmadan önce gerçekten kaynak ? Resmi bashgörselle yaptığım kısa testte , öyle görünmüyordu.
esmail

1
@esmail, ilk satırın ( SHELLtalimatın) adresleri budur. Birbirini izleyen RUN komutlarının, .bashrcdosyayı kaynak olarak kullanan bir oturum açma kabuğu kullanmasını sağlar . Not: yalnızca komutlar kabuk modunda çalıştırılırsa çalışır, örn. RUN nvm --version. Komutlar çalıştırma modunda çalıştırılırsa çalışmaz, örneğin.RUN ["nvm", "--version"]. Bunu daha açık hale getirmek için kabuk formu için sağladığım bağlantıyı güncelledim.
Dominic Roy-Stang

10

@Kuhess cevabındaki öneriye dayanarak, Dockerfile dosyamdaki kaynak komutunu aşağıdaki ile değiştirdim

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

8

İşte benim çalışma versiyonum

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;

@Abdulljibali ve @shamisis yanıtlarından yardım aldı.


~/.nvm/nvm.shDosyayı tedarik etmek ihtiyacım olan anahtardı.
Stephane

Bu benim için ubuntu 16.04.2 konteyneri ile çalışan tek çözümdü.
drohm

7

İşe yarayan bir örnek almak için her yerde araştırma yaptığım gerçeğiyle başlamalıyım. nvmİçeridendocker ve hiçbirini bulamadığım . Bu konudaki cevaplar bile işe yaramadı.

Bu yüzden, epey zaman geçirdim ve işe yarayan bir tane buldum:

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

Ben yüklemiş nasıl Bildirimi nodejsaracılığıyla apt-getda. Bu yapılmadığı sürece bazı paketlerin docker içine yüklenmediğini buldum.


evet - adamım - yaklaşık 100 çözümü denedi ve sadece seninki işe yarıyor - 10x!
srfrnk

~ / .Nvm / nvm-tmp.sh kullanmak doğru, böylece düğüm sürümleri ~ / .nvm dizini içinde doğru şekilde kurulur
guidoman

7

Sorudaki nvm komutunu alma girişimi arasındaki temel fark:

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

işe yaramayan ve kabul edilen cevapta aynısını yapma girişimi:

source $NVM_DIR/nvm.sh

İkinci sürüm nvm.sh betiğini doğrudan kaynaklarken, orijinal sürüm bunu .bashrc dosyası aracılığıyla yapmaya çalışır.

.Bashrc dosyasında, etkileşimli olmayan bir kabukta çalıştırılıyorsa, ilk çıkışta çıkan bir satır vardır:

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

Bu nedenle, nvm.sh'nin nereden kaynaklanacağı asla bitmez, bu da aslında nvm komutunu kabuğunuza yerleştirir.

Docker bu şeyleri etkileşimli olmayan bir kabukta çalıştırıyorsa şaşırmam. Bu açıkça belirtilmemişti, bu yüzden serseri ile benzer bir şey yaparken beni yakalayan şey bu olduğundan bahsedeceğimi düşündüm.


Sorunun kaynağını bulduğunuz için teşekkürler. /Etc/skel/.bashrc dosyasını temel ubuntu 19.10 görüntüsünden kopyaladım ve ardından yukarıdaki sorunlu satırları yorumladım. Sonra Dockerfile dosyamda, "düzeltilmiş" /etc/skel/.bashrc'yi / etc / skel'e kopyalamak için COPY komutunu kullandım ve bundan sonra kabuk olarak / bin / bash ile kullanıcılar oluşturmak için RUN'u kullandım. Ardından RUN ["/ bin / bash", "-c", "-l", YOUR_COMMAND [S] _HERE] için yapılan sonraki çağrılar iyi çalıştı.
Stephan Doliov

6

Bunu yapmanın en temiz yolunu bulmam bir iki saatimi aldı. --login .bashrc'yi çalıştırıyor gibi görünmüyor, bu nedenle etkileşimli modda başlatmak için -i sağlamanız gerekir. Bu Docker'ın size biraz bağırmasına neden oluyor, bu yüzden kurulum için sadece bu şekilde başlatıyorum, ardından standart kabuğuma sıfırlıyorum.

# 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"]

Cevabınız, benimkinin ubuntutemel resim olarak kullanılmadığını fark etmemi sağladı (ama sizinki öyle). debianTabanlı görüntüler kullanıyordum . İkisi arasındaki tutarsızlığa neyin sebep olduğundan emin değilim. Herhangi bir fikir?
Dominic Roy-Stang

Ubuntu 19:10'u temel görüntü olarak kullanıyorum. Benim için neyin işe yaradığına dair bir fikriniz olması için ilgili tüm Docker talimatlarını göndereceğim. Dışarıda bıraktığım talimatlar ya alakalı değil ya da sağlayamıyorum. Onları bir yorumla temsil edeceğim. Karakter sınırı çok düşük ayarlandığı için bir sonraki yorumda
yayınlayacağım

4

Bunların hiçbiri benim için işe yaramadı, python3-onbuildkapsayıcım için nvm kurulumuna sembolik bağlantılar oluşturmak zorunda kaldım.

# 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

Kabul. Bir docker konteynerine (Debian GNU / Linux 9 (stretch)) kurarken, nvm $HOME/.nvmde benim için bitiyor .
Dave Stevens

Evet, bana eklemek için sembolik bağlar da gerekliydi. Başkalarının buna nasıl ihtiyaç duymadığını merak ediyorum.
PEZO

0

Benim için işe yarayan şey buydu (Debian buster kullanıyorum):

RUN apt-get update
RUN apt-get install -y build-essential checkinstall libssl-dev
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.1/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"]

Şimdi yapabilmelisin nvm install <version>.


0

Sadece bir cevap curl kurulumunu koydu ancak Dockerfile'ın tamamını çalışmıyor

Burada , Ubuntu 18.04.3 LTS ile en son nvm 2020 sürümünü yüklediğim Dockerfile kopyalamaya / yapıştırmaya hazır

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.