Bagaimana cara menginstal nvm di docker?

101

Saya sedang dalam proses membangun image Docker baru dan saya ingin memasang NVM sehingga saya dapat mengelola nodejs.

Membaca dokumen tentang cara menginstal NVM, mereka menyebutkan bahwa Anda perlu mencari file .bashrc Anda untuk mulai menggunakan NVM.

Saya sudah mencoba mengatur ini di Dockerfile, tetapi sejauh ini pembangunan gagal dengan kesalahan:

"bash: nvm: perintah tidak ditemukan"

Berikut adalah baris yang relevan dari Dockerfile saya:

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"

Berikut adalah hasil dari mencoba membangun:

buruh pelabuhan membangun -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

Saya cukup baru mengenal Docker jadi saya mungkin kehilangan sesuatu yang mendasar untuk menulis Dockerfiles, tetapi sejauh ini semua pembacaan yang telah saya lakukan belum menunjukkan solusi yang baik.

David Ficociello
sumber
11
Bukan duplikat karena ini khusus untuk menginstal di dalam buruh pelabuhan dan bukan instalasi standar
David Ficociello
Karena Anda hanya menginstal satu versi node, tampaknya tidak perlu menginstal nvm. File Docker yang disediakan oleh repositori node Docker dapat digunakan sebagai referensi untuk cara menginstal node.
mikwat

Jawaban:

121

Ketika Anda RUN bash...setiap kali berjalan dalam proses yang terpisah, apa set di lingkungan tidak dipertahankan. Begini cara saya menginstal 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
Abdullah Jibaly
sumber
untuk mempercepatnya dalam dua kali ubah saja v0.20.0menjadiv0.24.1
itsnikolay
8
dengan nvm 0.31.0dan node v4.2.3jalurnya/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu
4
@thiagoh Ini tidak menjelaskan mengapa penginstalan nvm penanya tidak berfungsi dan jawaban yang berfungsi berhasil. Ini tidak ada hubungannya dengan shell yang berjalan dalam proses terpisah. Itu karena pertanyaan mencoba untuk mencari bash.rc untuk memuat file nvm.sh yang memuat perintah nvm ke dalam bash, tetapi bash.rc keluar lebih awal ketika dijalankan secara non-interaktif, jadi perintah nvm tidak dimuat. Semua jawaban sukses sumber nvm.sh secara langsung daripada melakukannya melalui bash.rc. Ini adalah kunci untuk membuat ini berhasil.
tobuslieven
2
Alih-alih mengganti sh dengan bash, Anda bisa melakukannya . $NVM_DIR/nvm.sh, hindari biner sumber.
Razvan Grigore
3
Ini dekat, tetapi jalur membutuhkan sedikit penyesuaian, seharusnya: ENV NODE_PATH $ NVM_DIR / versi / node / v $ NODE_VERSION / lib / node_modules ENV PATH $ NVM_DIR / versi / node / v $ NODE_VERSION / bin: $ PATH
Lunulata
31

Untuk membantu semua orang yang mencari cara untuk menginstal Node.js dengan NVM di Ubuntu (versi terakhir), saya membuat file dok di bawah ini. Saya menggunakan versi terakhir Docker, Ubuntu, Node.js dan NVM berfungsi dengan baik ($ PATH telah diperbaiki). Saya menggunakan ini dalam lingkungan produksi.

$ 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"]
danilodeveloper
sumber
1
haruskah NODE_PATH bukan ENV NODE_PATH $ NVM_DIR / versi / node / v $ NODE_VERSION / lib / node_modules
Sentient
Halo @Sentient! Saya menjalankan buruh pelabuhan ini di lingkungan produksi (ubuntu) dan dev lokal (OSX), keduanya bekerja dengan baik, tanpa kesalahan. Apakah Anda mungkin menjalankan NVM yang sudah ketinggalan zaman?
danilodeveloper
Apakah ada alasan mengapa saya harus menggunakan SUDO untuk menginstal build-essential dan libssl-dev? Saya sama sekali bukan DevOps yang berpengalaman.
a.barbieri
1
Kuncinya adalahsource $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea
24

Jalur nvm telah berubah sejak jawaban diterima, jadi jika Anda ingin menggunakan versi nvm yang lebih mutakhir, Anda perlu melakukan beberapa perubahan. Juga, tidak perlu memetakan ulang shuntuk membuatnya berfungsi:

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

Tidak yakin apakah Anda memerlukan --delete-prefixopsi pada nvm use- Saya lakukan, tapi itu mungkin sesuatu yang aneh tentang gambar dasar saya.

Steve Campbell
sumber
1
Penolong! Andai saja saya telah melihat tanggapan Anda 3 jam yang lalu.
Adrian Marinica
Bekerja untuk saya, gambar dasar php: 7.1.1
Toby Mellor
18

Masing-masing RUNdi Dockerfile dijalankan di wadah yang berbeda. Jadi jika Anda mencari file dalam wadah, isinya tidak akan tersedia di wadah berikutnya.

Itulah mengapa ketika Anda menginstal aplikasi dan Anda perlu melakukan beberapa langkah, Anda harus melakukannya di wadah yang sama.

Dengan contoh Anda:

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
Kuhess
sumber
Oke terima kasih banyak atas penjelasannya. Jadi saya telah memodifikasi skrip saya menjadi seperti ini: `DARI ubuntu MAINTAINER dficociello TAMBAHKAN file / nvm_install.sh / root / # Install nvm RUN [" / bin / bash "," -c "," rm -f / etc / nginx / nginx.conf && sentuh /root/.bashrc && pembaruan apt-get && 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 "] TAMBAHKAN file / nginx.conf / etc / nginx / EXPOSE 22` Saya mendapatkan error berikut: `/ bin / bash: /root/nvm_install.sh: / bin / bash: interpreter buruk: File teks sibuk ``
David Ficociello
Kesalahan ini harus ditautkan ke jalur Anda RUN ["/bin/bash", ...]. Ini tidak boleh diapit oleh [...]dan Anda tidak perlu menentukan penerjemahnya /bin/bash -c.
Kuhess
17

Ini didasarkan pada jawaban teratas dan berhasil di 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

Perhatikan bahwa nvmini bukan perintah bash, ini adalah alias. Ini dapat mengacaukan Anda jika Anda mengandalkan $PATH.

rjurney.dll
sumber
15

Perbarui 20/02/2020 : Solusi ini berfungsi jika Anda menggunakan debiangambar dasar. Jika Anda menggunakan ubuntu, lihat jawaban ini .

Berikut adalah cara pemasangan terbersih nvmyang saya temukan:

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

Penjelasan

  • Baris pertama menyetel shell default Dockerfile ke shell login bash . Catatan: ini berarti bahwa setiap berikutnya RUN,, CMDdan ENTRYPOINTakan dijalankan di bawah pengguna saat ini (biasanya root), dan sumber file ~ / .bashrc jika dijalankan dalam bentuk shell .

  • Baris kedua diinstal nvmdengan bash. Ketika skrip dijalankan dengan bash, itu ditambahkan ke file ~ / .bashrc .

  • Baris ketiga menginstal versi nodejs tertentu dan menggunakannya. Perintah nvm,, npmdan nodetersedia karena dijalankan melalui shell login bash (lihat baris 1).

Dominic Roy-Stang
sumber
1
Terima kasih banyak !
Gaui
Menarik bahwa ini berhasil untuk Anda. Saya mencoba sesuatu yang serupa dan semuanya tampak baik-baik saja selama pembuatan, tetapi NPM tidak ditemukan ketika saya menjalankan gambar yang dihasilkan. Pengaturan eksplisit NVM_DIR(seperti yang ditunjukkan di beberapa jawaban lain) memperbaikinya untuk saya.
esmail
1
@esmail itu aneh karena RUNperintah pertama NVM_DIRmasuk ~/.bashrc.
Dominic Roy-Stang
1
@ DominicRoy-Stang, poin yang valid. Gambar yang saya gunakan untuk bekerja shdan karena itu mengabaikannya .bashrc. Juga, apakah Anda yakin .bashrcbenar-benar bersumber sebelum menjalankan RUNperintah? Dalam pengujian singkat saya dengan bashgambar resmi , sepertinya tidak.
esmail
1
@esmail itulah SHELLalamat baris pertama ( instruksi). Itu membuat perintah RUN berturut-turut menggunakan shell login yang menjadi sumber .bashrcfile. Catatan: ini hanya berfungsi jika perintah dijalankan dalam mode shell misalnya. RUN nvm --version. Ini tidak akan bekerja jika perintah dijalankan dalam mode exec misalnya. RUN ["nvm", "--version"]. Saya telah memperbarui tautan yang saya berikan untuk formulir shell agar mudah-mudahan membuatnya lebih jelas.
Dominic Roy-Stang
10

Berdasarkan saran dalam jawaban @Kuhess, saya mengganti perintah sumber dengan yang berikut di Dockerfile saya

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

Ini versi kerja saya

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;

Butuh bantuan dari @abdulljibali dan @shamisis jawaban.

Tahir Rauf
sumber
Sourcing ~/.nvm/nvm.shfile adalah kunci yang saya butuhkan.
Stephane
Ini adalah satu-satunya solusi yang berhasil untuk saya dengan kontainer ubuntu 16.04.2.
drohm
7

Saya harus mulai dengan fakta bahwa saya mencari ke seluruh penjuru untuk mendapatkan contoh kerja dari nvmdalam dockerdan saya tidak menemukannya. Bahkan jawaban di utas ini tidak berhasil.

Jadi, saya menghabiskan beberapa waktu dan menemukan yang berhasil:

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

Perhatikan bagaimana saya telah menginstal nodejsvia apt-getjuga. Saya menemukan bahwa beberapa paket tidak terinstal di dalam buruh pelabuhan kecuali ini dilakukan.

Shamasis Bhattacharya
sumber
yup - man - mencoba sekitar 100 solusi dan hanya solusi Anda yang berhasil - 10x!
srfrnk
Benar untuk menggunakan ~ / .nvm / nvm-tmp.sh, jadi versi node diinstal dengan benar di dalam direktori ~ / .nvm
guidoman
7

Perbedaan utama antara upaya untuk mendapatkan perintah nvm dalam pertanyaan:

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

yang tidak berhasil dan upaya untuk melakukan hal yang sama dalam jawaban yang diterima:

source $NVM_DIR/nvm.sh

Apakah itu versi kedua mengambil skrip nvm.sh secara langsung, sedangkan versi asli mencoba melakukannya melalui file .bashrc.

File .bashrc memiliki baris di dalamnya yang akan keluar jika dijalankan di shell non-interaktif:

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

Jadi itu tidak pernah sampai ke tempat yang akan bersumber nvm.sh yang sebenarnya menempatkan perintah nvm di shell Anda.

Saya tidak akan terkejut jika buruh pelabuhan menjalankan barang ini di shell non interaktif. Ini belum secara eksplisit ditunjukkan, jadi saya pikir saya akan menyebutkannya karena itulah yang menarik perhatian saya ketika saya melakukan sesuatu yang mirip dengan gelandangan.

tobuslieven.dll
sumber
Terima kasih telah menemukan sumber masalahnya. Saya menyalin file /etc/skel/.bashrc dari gambar dasar ubuntu 19.10 dan kemudian mengomentari baris yang menyinggung di atas. Kemudian di Dockerfile saya, saya menggunakan perintah COPY untuk menyalin /etc/skel/.bashrc yang "dikoreksi" ke / etc / skel dan hanya setelah itu menggunakan RUN untuk membuat pengguna dengan / bin / bash sebagai shell mereka. Kemudian panggilan berikutnya ke RUN ["/ bin / bash", "-c", "-l", YOUR_COMMAND [S] _HERE] berfungsi dengan baik.
Stephan Doliov
6

Butuh satu atau dua jam untuk menemukan cara terbersih untuk melakukannya. --login sepertinya tidak mengeksekusi .bashrc jadi Anda harus menyediakan -i untuk meluncurkannya dalam mode interaktif. Ini menyebabkan Docker meneriaki Anda sebentar jadi saya hanya meluncurkan cara ini untuk instalasi, lalu mengatur ulang ke shell standar saya.

# 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"]
pengguna2896438
sumber
Jawaban Anda membuat saya menyadari bahwa milik saya tidak berfungsi ubuntusebagai gambar dasar (tetapi milik Anda berfungsi ). Saya menggunakan debiangambar berbasis. Saya tidak yakin apa yang menyebabkan perbedaan di antara keduanya. Ada ide?
Dominic Roy-Stang
Saya menggunakan ubuntu 19:10 sebagai gambar dasar. Saya akan memposting semua instruksi Docker yang relevan sehingga Anda memiliki ide tentang apa yang berhasil untuk saya. Setiap instruksi yang saya tinggalkan tidak relevan atau tidak dapat saya berikan. Saya akan mewakili mereka dengan komentar. Saya akan mempostingnya di komentar berikutnya karena batas karakter disetel terlalu rendah
pengguna2896438
4

Tak satu pun dari ini berfungsi untuk saya, untuk python3-onbuildwadah saya, saya harus membuat tautan simbolis secara paksa ke instalasi 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
Corey Cole
sumber
Sepakat. Saat menginstal dalam container docker (Debian GNU / Linux 9 (stretch)), nvm juga digunakan $HOME/.nvmuntuk saya.
Dave Stevens
Ya, tautan simbolik juga perlu ditambahkan ke saya. Saya bertanya-tanya bagaimana orang lain bahkan tidak membutuhkannya.
PEZO
0

Inilah yang berhasil untuk saya (saya menggunakan buster debian):

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

Anda sekarang harus bisa melakukannya nvm install <version>.

Alejandro Escobar
sumber
0

Hanya satu jawaban yang menempatkan instalasi curl tetapi tidak berfungsi di seluruh Dockerfile

Di sini Dockerfile saya siap untuk di-copy / paste di mana saya menginstal versi nvm 2020 terbaru dengan Ubuntu 18.04.3 LTS

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
JRichardsz
sumber