Я нахожусь в процессе создания нового образа Docker, и я хочу установить NVM, чтобы я мог управлять nodejs.
Читая документацию о том, как установить NVM, они упоминают, что вам нужно получить файл .bashrc, чтобы начать использовать NVM.
Я попытался настроить это в Dockerfile, но пока не удается построить с ошибкой:
"bash: nvm: команда не найдена"
Вот соответствующие строки из моего 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"
Вот результат попытки сборки:
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, поэтому мне может не хватать чего-то важного для написания файлов Docker, но пока все прочитанное мной не показало мне хорошего решения.
Ответы:
Когда вы
RUN bash...
каждый раз запускаете отдельный процесс, все, что установлено в среде, не поддерживается. Вот как я устанавливаюnvm
:источник
v0.20.0
наv0.24.1
0.31.0
и nodev4.2.3
путь/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
, избегая исходных двоичных файлов.Чтобы помочь всем, кто ищет способ установить Node.js с NVM в Ubuntu (последняя версия), я создал файл докеров ниже. Я использую последнюю версию Docker, Ubuntu, Node.js, и NVM работает правильно ($ PATH исправлен). Я использую это в производственной среде.
dockerfile:
источник
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Пути nvm изменились с момента принятого ответа, поэтому, если вы хотите использовать более свежую версию nvm, вам нужно внести несколько изменений. Кроме того, для работы не требуется переназначение
sh
:Не уверен, что вам понадобится
--delete-prefix
опция наnvm use
- я сделал, но это может быть что-то странное в моем базовом образе.источник
Каждый
RUN
из Dockerfile выполняется в другом контейнере. Поэтому, если вы отправляете файл в контейнер, его содержимое не будет доступно в следующем.Вот почему, когда вы устанавливаете приложение и вам нужно выполнить несколько шагов, вы должны сделать это в одном контейнере.
С вашим примером:
источник
RUN ["/bin/bash", ...]
. Он не должен быть окружен,[...]
и вам не нужно указывать интерпретатор/bin/bash -c
.Это основано на верхнем ответе и работает в 2018 году:
Обратите внимание, что
nvm
это не команда bash, это псевдоним. Это может облажаться, если вы полагаетесь на него$PATH
.источник
Обновление 20/02/2020 : это решение работает, если вы используете
debian
базовый образ. Если вы используетеubuntu
, см. Этот ответ .Вот самый чистый способ установки,
nvm
который я нашел:Объяснение
Первая строка устанавливает оболочку Dockerfile по умолчанию для оболочки входа в bash . Примечание: это означает, что каждое последующее
RUN
,CMD
иENTRYPOINT
будет запускаться под текущим пользователем (обычно root) и исходным файлом ~ / .bashrc, если запускаться в форме оболочки .Вторая строка устанавливается
nvm
с помощью bash. Когда сценарий запускается с помощью bash, он добавляется в файл ~ / .bashrc .Третья строка устанавливает определенную версию nodejs и использует ее. В
nvm
,npm
иnode
команды доступны , потому что они работают через Баш оболочку входа (см строка 1).источник
NVM_DIR
(как показано в нескольких других ответах) исправила это для меня.RUN
наборы командNVM_DIR
в~/.bashrc
.sh
и поэтому игнорирует.bashrc
. Кроме того, вы уверены, что.bashrc
это действительно источник перед выполнениемRUN
команд? В моем кратком тестировании с официальнымbash
изображением мне показалось, что это не так.SHELL
инструкция) адрес. Он заставляет последовательные команды RUN использовать оболочку входа в систему, которая является источником.bashrc
файла. Примечание: это работает, только если команды выполняются в режиме оболочки, например.RUN nvm --version
. Это не будет работать, если команды выполняются в режиме exec, например.RUN ["nvm", "--version"]
. Я обновил ссылку на форму оболочки, чтобы, надеюсь, сделать это более очевидным.Основываясь на предложении в ответе @Kuhess, я заменил исходную команду следующей в моем Dockerfile
источник
Вот моя рабочая версия
Получил помощь от ответов @abdulljibali и @shamisis.
источник
~/.nvm/nvm.sh
файла был ключевым моментом, который мне был нужен.Я должен начать с того, что я искал повсюду, чтобы найти рабочий пример
nvm
внутренней части,docker
но не нашел. Даже ответы в этой теме не помогли.Итак, я потратил довольно много времени и нашел тот, который работает:
источник
Ключевое отличие попытки получить команду nvm в вопросе:
который не работает, и попытка сделать то же самое в принятом ответе:
В том, что вторая версия напрямую использует сценарий nvm.sh, тогда как исходная версия пытается сделать это через файл .bashrc.
В файле .bashrc есть строка в начале, которая завершается, если он запускается в неинтерактивной оболочке:
Таким образом, он никогда не доходит до того места, где он мог бы получить nvm.sh, который фактически помещает команду nvm в вашу оболочку.
Я не удивлюсь, если докер запустит все это в неинтерактивной оболочке. Это не было явно указано, поэтому я подумал, что упомяну об этом, потому что это то, что меня привлекло, когда я делал что-то подобное с vagrant.
источник
Мне потребовался час или два, чтобы придумать самый чистый способ сделать это. --login, похоже, не выполняет .bashrc, поэтому вам нужно указать -i, чтобы запустить его в интерактивном режиме. Это заставляет Docker немного кричать на вас, поэтому я запускаю этот способ только для установки, а затем возвращаюсь к своей стандартной оболочке.
источник
ubuntu
в качестве базового изображения (а ваш - работает). Я использовалdebian
изображения на основе. Я не уверен, что вызывает несоответствие между ними. Любые идеи?У меня ничего из этого не сработало, для моего
python3-onbuild
контейнера мне пришлось принудительно создать символические ссылки на установку nvm.источник
$HOME/.nvm
меня.Вот что у меня сработало (я использую debian buster):
Теперь вы можете это сделать
nvm install <version>
.источник
Всего один ответ - установка curl, но не работает весь Dockerfile
Вот мой Dockerfile, готовый к копированию / вставке, в который я устанавливаю последнюю версию nvm 2020 с Ubuntu 18.04.3 LTS
источник