node.js - manager - update node js
instalar nvm en la ventana acoplable (11)
Aquí está la forma más limpia de instalar
nvm
que he encontrado:
SHELL ["/bin/bash", "--login", "-c"]
RUN curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN nvm install 10.15.3 && nvm use 10.15.3
Explicación
-
La primera línea establece el shell predeterminado del Dockerfile en un shell de inicio de sesión bash . Nota: esto significa que cada
RUN
,CMD
yENTRYPOINT
se ejecutarán bajo el usuario actual (generalmente root), y se generará el archivo ~ / .bashrc si se ejecuta en el formulario de shell . -
La segunda línea instala
nvm
con bash. Cuando el script se ejecuta con bash, se agrega al archivo ~ / .bashrc . -
La tercera línea instala una versión particular de nodejs y la usa. Los comandos
nvm
,npm
ynode
están disponibles porque se ejecutan a través de un shell de inicio de sesión bash (consulte la línea 1).
Estoy en el proceso de crear una nueva imagen de Docker y estoy buscando instalar NVM para poder administrar nodejs.
Al leer los documentos sobre cómo instalar NVM, mencionan que necesita obtener su archivo .bashrc para comenzar a usar NVM.
He intentado configurar esto en un Dockerfile, pero hasta ahora la construcción falla con el error:
"bash: nvm: comando no encontrado"
Aquí están las líneas relevantes de mi 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"
Aquí está el resultado de intentar construir:
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
Soy bastante nuevo en Docker, por lo que es posible que me falte algo fundamental para escribir Dockerfiles, pero hasta ahora toda la lectura que he hecho no me ha mostrado una buena solución.
Gracias
Aquí está mi versión de trabajo
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;
Recibió ayuda de @abdulljibali y @shamisis respuestas.
Basado en la sugerencia en la respuesta de @Kuhess, reemplacé el comando de origen con el siguiente en mi Dockerfile
RUN cat ~/.nvm/nvm.sh >> installnode.sh
RUN echo "nvm install 0.10.35" >> installnode.sh
RUN sh installnode.sh
Cada ejecución en un Dockerfile se ejecuta en un contenedor diferente. Por lo tanto, si obtiene un archivo en un contenedor, su contenido no estará disponible en el siguiente.
Es por eso que cuando instala una aplicación y necesita hacer varios pasos, debe hacerlo en el mismo contenedor.
Con tu ejemplo:
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
Cuando ejecuta
RUN bash...
cada vez que se ejecuta en un proceso separado, no se mantiene nada establecido en el entorno.
Así es como instalo
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
Debo comenzar con el hecho de que busqué por todas partes para obtener un ejemplo funcional de
nvm
dentro de
docker
y no encontré ninguno.
Incluso las respuestas en este hilo no funcionaron.
Entonces, pasé bastante tiempo y se me ocurrió uno que funciona:
# 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;
Observe cómo he instalado
nodejs
través deapt-get
también. Descubrí que algunos paquetes no se instalan dentro de la ventana acoplable a menos que se haga esto.
Esto se basa en la respuesta principal y funciona en 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
Tenga en cuenta que
nvm
no es un comando bash, es un alias.
Esto puede fastidiarte si confías en
$PATH
.
Las rutas de Nvm han cambiado desde la respuesta aceptada, por lo que si desea utilizar una versión de nvm más actualizada, debe realizar algunos cambios.
Además, no es necesario reasignar
sh
para que funcione:
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
No estoy seguro de si necesitará la opción
--delete-prefix
en el
nvm use
- lo hice, pero eso puede ser algo extraño en mi imagen base.
Ninguno de estos funcionó para mí, para mi
python3-onbuild
tuve que forzar la creación de enlaces simbólicos a la instalación de 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
Para ayudar a todos los que buscan una manera de instalar Node.js con NVM en Ubuntu (última versión), hice el dockerfile a continuación. Estoy usando la última versión de Docker, Ubuntu, Node.js y el NVM funciona correctamente (se solucionó el $ PATH). Estoy usando esto en un entorno de producción.
$ 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"]
Una diferencia clave entre el intento de obtener el comando nvm en la pregunta:
RUN bash -l -c "source /root/.bashrc"
que no funciona y el intento de hacer lo mismo en la respuesta aceptada:
source $NVM_DIR/nvm.sh
Es que la segunda versión obtiene el script nvm.sh directamente, mientras que el original intenta hacerlo a través del archivo .bashrc.
El archivo .bashrc tiene una línea temprana que sale si se ejecuta en un shell no interactivo:
# If not running interactively, don''t do anything
case $- in
*i*) ;;
*) return;;
esac
Por lo tanto, nunca llega al punto donde habría originado nvm.sh, que en realidad coloca el comando nvm en su shell.
No me sorprendería si Docker está ejecutando estas cosas en un shell no interactivo. Esto no se había señalado explícitamente, así que pensé en mencionarlo, ya que es lo que me llamó la atención cuando estaba haciendo algo similar con vagabundo.