update node manager descargar node.js docker nvm

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 y ENTRYPOINT 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 y node 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 de apt-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.