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.
Jawaban:
Ketika Anda
RUN bash...
setiap kali berjalan dalam proses yang terpisah, apa set di lingkungan tidak dipertahankan. Begini cara saya menginstalnvm
:sumber
v0.20.0
menjadiv0.24.1
0.31.0
dan nodev4.2.3
jalurnya/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
, hindari biner sumber.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.
dockerfile:
sumber
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
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
sh
untuk membuatnya berfungsi:Tidak yakin apakah Anda memerlukan
--delete-prefix
opsi padanvm use
- Saya lakukan, tapi itu mungkin sesuatu yang aneh tentang gambar dasar saya.sumber
Masing-masing
RUN
di 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:
sumber
RUN ["/bin/bash", ...]
. Ini tidak boleh diapit oleh[...]
dan Anda tidak perlu menentukan penerjemahnya/bin/bash -c
.Ini didasarkan pada jawaban teratas dan berhasil di 2018:
Perhatikan bahwa
nvm
ini bukan perintah bash, ini adalah alias. Ini dapat mengacaukan Anda jika Anda mengandalkan$PATH
.sumber
Perbarui 20/02/2020 : Solusi ini berfungsi jika Anda menggunakan
debian
gambar dasar. Jika Anda menggunakanubuntu
, lihat jawaban ini .Berikut adalah cara pemasangan terbersih
nvm
yang saya temukan:Penjelasan
Baris pertama menyetel shell default Dockerfile ke shell login bash . Catatan: ini berarti bahwa setiap berikutnya
RUN
,,CMD
danENTRYPOINT
akan dijalankan di bawah pengguna saat ini (biasanya root), dan sumber file ~ / .bashrc jika dijalankan dalam bentuk shell .Baris kedua diinstal
nvm
dengan bash. Ketika skrip dijalankan dengan bash, itu ditambahkan ke file ~ / .bashrc .Baris ketiga menginstal versi nodejs tertentu dan menggunakannya. Perintah
nvm
,,npm
dannode
tersedia karena dijalankan melalui shell login bash (lihat baris 1).sumber
NVM_DIR
(seperti yang ditunjukkan di beberapa jawaban lain) memperbaikinya untuk saya.RUN
perintah pertamaNVM_DIR
masuk~/.bashrc
.sh
dan karena itu mengabaikannya.bashrc
. Juga, apakah Anda yakin.bashrc
benar-benar bersumber sebelum menjalankanRUN
perintah? Dalam pengujian singkat saya denganbash
gambar resmi , sepertinya tidak.SHELL
alamat baris pertama ( instruksi). Itu membuat perintah RUN berturut-turut menggunakan shell login yang menjadi sumber.bashrc
file. 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.Berdasarkan saran dalam jawaban @Kuhess, saya mengganti perintah sumber dengan yang berikut di Dockerfile saya
sumber
Ini versi kerja saya
Butuh bantuan dari @abdulljibali dan @shamisis jawaban.
sumber
~/.nvm/nvm.sh
file adalah kunci yang saya butuhkan.Saya harus mulai dengan fakta bahwa saya mencari ke seluruh penjuru untuk mendapatkan contoh kerja dari
nvm
dalamdocker
dan saya tidak menemukannya. Bahkan jawaban di utas ini tidak berhasil.Jadi, saya menghabiskan beberapa waktu dan menemukan yang berhasil:
sumber
Perbedaan utama antara upaya untuk mendapatkan perintah nvm dalam pertanyaan:
yang tidak berhasil dan upaya untuk melakukan hal yang sama dalam jawaban yang diterima:
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:
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.
sumber
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.
sumber
ubuntu
sebagai gambar dasar (tetapi milik Anda berfungsi ). Saya menggunakandebian
gambar berbasis. Saya tidak yakin apa yang menyebabkan perbedaan di antara keduanya. Ada ide?Tak satu pun dari ini berfungsi untuk saya, untuk
python3-onbuild
wadah saya, saya harus membuat tautan simbolis secara paksa ke instalasi nvm.sumber
$HOME/.nvm
untuk saya.Inilah yang berhasil untuk saya (saya menggunakan buster debian):
Anda sekarang harus bisa melakukannya
nvm install <version>
.sumber
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
sumber