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.
Intenté 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 puede que me esté perdiendo algo fundamental para escribir Dockerfiles, pero hasta ahora toda la lectura que he hecho no me ha mostrado una buena solución.
Respuestas:
Cuando
RUN bash...
cada vez que se ejecuta en un proceso separado, no se mantiene nada configurado en el entorno. Así es como instalonvm
:fuente
v0.20.0
av0.24.1
0.31.0
y nodo,v4.2.3
la ruta es/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
, evitando el código fuente binario.Para ayudar a todos los que buscan una forma de instalar Node.js con NVM en Ubuntu (última versión), hice el archivo docker a continuación. Estoy usando la última versión de Docker, Ubuntu, Node.js y el NVM funciona correctamente (se corrigió el $ PATH). Estoy usando esto en un entorno de producción.
dockerfile:
fuente
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
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:No estoy seguro de si necesitará la
--delete-prefix
opción ennvm use
... lo hice, pero eso puede ser algo extraño en mi imagen base.fuente
Cada
RUN
en un Dockerfile se ejecuta en un contenedor diferente. Entonces, si obtiene un archivo en un contenedor, su contenido no estará disponible en el siguiente.Es por ello que cuando instalas una aplicación y necesitas hacer varios pasos, debes hacerlo en el mismo contenedor.
Con tu ejemplo:
fuente
RUN ["/bin/bash", ...]
. No debe estar rodeado[...]
y no es necesario especificar el intérprete/bin/bash -c
.Esto se basa en la respuesta principal y funciona en 2018:
Tenga en cuenta que
nvm
no es un comando bash, es un alias. Esto puede arruinarte si confías en$PATH
.fuente
Actualización 20/02/2020 : esta solución funciona si está utilizando una
debian
imagen base. Si está usandoubuntu
, vea esta respuesta .Aquí está la forma más limpia de instalar
nvm
que he encontrado:Explicación
La primera línea establece el shell predeterminado de Dockerfile en un shell de inicio de sesión bash . Nota: esto significa que todos los posteriores
RUN
,CMD
yENTRYPOINT
se ejecutarán bajo el usuario actual (generalmente root), y el origen del archivo ~ / .bashrc si se ejecuta en forma de shell .La segunda línea se 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
nvm
,npm
ynode
comandos están disponibles, ya que se ejecutan a través de una cáscara del golpe de inicio de sesión (véase la línea 1).fuente
NVM_DIR
(como se muestra en varias de las otras respuestas) lo arregló para mí.RUN
conjuntos de comandosNVM_DIR
en~/.bashrc
.sh
y por lo tanto ignora.bashrc
. Además, ¿.bashrc
está seguro de que realmente se obtiene antes de ejecutar losRUN
comandos? En mi breve prueba con labash
imagen oficial , parecía que no lo era.SHELL
instrucción). Hace que los comandos RUN consecutivos utilicen un shell de inicio de sesión que genera el.bashrc
archivo. Nota: solo funciona si los comandos se ejecutan en modo shell, por ejemplo.RUN nvm --version
. No funcionará si los comandos se ejecutan en modo exec, por ejemplo.RUN ["nvm", "--version"]
. He actualizado el enlace que proporciono para el formulario de shell para que esto sea más obvio.Según la sugerencia en la respuesta de @Kuhess, reemplacé el comando de origen con lo siguiente en mi Dockerfile
fuente
Aquí está mi versión de trabajo
Recibí ayuda de @abdulljibali y @shamisis responde.
fuente
~/.nvm/nvm.sh
archivo era la clave que necesitaba.Debo comenzar con el hecho de que busqué por todas partes para obtener un ejemplo funcional del
nvm
interiordocker
y no encontré ninguno. Incluso las respuestas en este hilo no funcionaron.Entonces, pasé bastante tiempo y se me ocurrió uno que funciona:
fuente
Una diferencia clave entre el intento de obtener el comando nvm en la pregunta:
que no funciona y el intento de hacer lo mismo en la respuesta aceptada:
Es que la segunda versión obtiene el script nvm.sh directamente, mientras que la original intenta hacerlo a través del archivo .bashrc.
El archivo .bashrc tiene una línea al principio que sale si se está ejecutando en un shell no interactivo:
Por lo tanto, nunca llega al bit en el que habría obtenido nvm.sh, que en realidad coloca el comando nvm en su shell.
No me sorprendería que Docker ejecute 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 sorprendió cuando estaba haciendo algo similar con vagabundo.
fuente
Me tomó una hora o dos encontrar la forma más limpia de hacerlo. --login no parece ejecutar .bashrc, por lo que debe proporcionar -i para iniciarlo en modo interactivo. Esto hace que Docker te grite por un momento, así que solo lo ejecuto de esta manera para la instalación, luego reinicio a mi shell estándar.
fuente
ubuntu
como imagen base (pero la tuya sí). Estaba usandodebian
imágenes basadas. No estoy seguro de qué está causando la discrepancia entre los dos. ¿Algunas ideas?Ninguno de estos funcionó para mí, para mi
python3-onbuild
contenedor tuve que forzar la creación de enlaces simbólicos a la instalación de nvm.fuente
$HOME/.nvm
mi lugar.Esto es lo que funcionó para mí (estoy usando debian buster):
Ahora debería poder hacerlo
nvm install <version>
.fuente
Solo una respuesta puso la instalación curl pero no funciona todo el Dockerfile
Aquí mi Dockerfile listo para copiar / pegar en el que instalo la última versión de nvm 2020 con Ubuntu 18.04.3 LTS
fuente