Установить nvm в докере
Я собираюсь создать новое изображение Docker, и я ищу, чтобы установить NVM, чтобы я мог управлять nodejs.
Считывая документы о том, как установить NVM, они упоминают, что вам нужно загрузить файл .bashrc, чтобы начать использовать NVM.
Я попытался установить это в файле Docker, но до сих пор здание выходит из строя с ошибкой:
"bash: nvm: команда не найдена
Вот соответствующие строки из моего файла Docker:
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, поэтому мне может не хватать чего-то фундаментального для написания Dockerfiles, но пока все показания, которые я сделал, не показали мне хорошего решения.
Спасибо
Ответы
Ответ 1
Когда вы запускаете RUN bash...
каждый раз, когда он запускается в отдельном процессе, все, что установлено в среде, не сохраняется. Вот как я устанавливаю 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
Ответ 2
Чтобы помочь всем, кто ищет способ установить Node.js с NVM на Ubuntu (последняя версия), я сделал файл докеров ниже. Я использую последнюю версию Docker, Ubuntu, Node.js, и NVM работает исправно (исправлено $PATH). Я использую это в рабочей среде.
$ 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 sudo 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"]
Ответ 3
Каждый RUN
в файле Docker выполняется в другом контейнере. Поэтому, если вы загружаете файл в контейнер, его содержимое будет недоступно в следующем.
Вот почему, когда вы устанавливаете приложение, и вам нужно сделать несколько шагов, вы должны сделать это в том же контейнере.
В вашем примере:
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
Ответ 4
Пути Nvm изменились с момента принятия ответа, поэтому, если вы хотите использовать более современную версию nvm, вам нужно внести несколько изменений. Кроме того, нет необходимости переназначать sh
, чтобы заставить его работать:
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-prefix
на nvm use
- я это сделал, но это может быть что-то странное в моем базовом изображении.
Ответ 5
Это основано на верхнем ответе и работает в 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
Обратите внимание, что nvm
- это не команда bash, а псевдоним. Это может сбить вас с толку, если вы полагаетесь на $PATH
.
Ответ 6
Вот моя рабочая версия
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 и @shamisis.
Ответ 7
Основываясь на предложении в ответе @Kuhess, я заменил исходную команду следующим в моем Dockerfile
RUN cat ~/.nvm/nvm.sh >> installnode.sh
RUN echo "nvm install 0.10.35" >> installnode.sh
RUN sh installnode.sh
Ответ 8
Я должен начать с того, что я искал все, чтобы получить рабочий пример nvm
внутри docker
, и я не нашел его. Даже ответы в этой теме не работали.
Итак, я потратил довольно много времени и придумал тот, который работает:
# 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;
Обратите внимание, как я установил nodejs
через apt-get
. Я обнаружил, что некоторые пакеты не устанавливаются внутри докера, если это не сделано.
Ответ 9
Ключевое различие между попыткой получить команду nvm в вопросе:
RUN bash -l -c "source /root/.bashrc"
который не работает, и попытка сделать то же самое в принятом ответе:
source $NVM_DIR/nvm.sh
Является ли вторая версия источником nvm.sh script напрямую, тогда как оригинал пытается сделать это через файл .bashrc.
В файле .bashrc есть строка, в которой он находится на ранней стадии, если он запускается в неинтерактивной оболочке:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Таким образом, он никогда не попадает в бит, где он будет получать nvm.sh, который фактически помещает команду nvm в вашу оболочку.
Я не удивлюсь, если docker запускает этот материал в неинтерактивной оболочке. Это явно не указывалось, поэтому я подумал, что буду упоминать об этом, поскольку это меня поймало, когда я делал что-то похожее с бродягой.
Ответ 10
Ничто из этого не python3-onbuild
мне, для моего python3-onbuild
мне пришлось принудительно создавать символические ссылки на установку 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