Entendiendo el cache de layers para estructurar correctamente tus imágenes
Clase 18 de 25 • Fundamentos de Docker 2018
Contenido del curso
Clase 18 de 25 • Fundamentos de Docker 2018
Contenido del curso
TeamQA
Julio Hernandez Gorocica
Moisés Cedeño
Carlos Andrés Charris S
Leonidas Menendez
Mau Munguia
Jorge Cardoso
Oscar Rodrigo Leon Mojica
JOSE LUIS AVALOS IZAGUIRRE
Oscar Rodrigo Leon Mojica
Kirlled Anderson Araque
Freddy Dagner Encinas Manjon
Freddy Dagner Encinas Manjon
Creck Brayan Mauri Pastor Paredes
Leylon Ocaña Sanchez
Emanuel Alejandro Mamani
Luis Felipe Vanegas Pill
Raúl Bauzan Robles
Rodolfo Ferreira Casetti
Axel David Espinosa Meneses
Jhonatan Holguín
Christian Ruiz
José Emanuel Osorio Vázquez
Super team
Ivan Dario Quintero Rios
Hinder Adrian Alvarez Perlaza
William Schnaider Torres Bermon
Nicolás Neira Navarrete
Usuario anónimo
Carlos Javier Bazan Huaman
Felipe Jurado Murillo
Rafael Martínez
Ever Alfredo Sorto Ayala
Fernando Hernandez
Carmen Santiago
Ever Alfredo Sorto Ayala
Roger Carlos Ariel Alba
Alejandro Valenzuela
Gonzalo Amador Hernández
Don riata Sabrozon
Juan Castro
si alguien tiene un problema con este tipo error
[nodemon] starting node index.js
internal/modules/cjs/loader.js:638
throw err;
^
la solucion que realice fueron las siguientes instrucciones
1 - npm install
2 - npm audit fix
3 - docker build -t ubuntu:platzi .
4 - docker run --rm -p 3000:3000 -v ${PWD}:/usr/src platziapp
esta manera me funciono el servicio
Mismo error, si me sirvió. ¡Muchas gracias!
Muchas gracias, me funcionó con tus pasos.
para mejorar el cache y la velocidad de construcción de nuestra imagen es recomendable saber organizar y distribuir el comando copy
FROM node:10 COPY ["package.json", "package-lock.json", "/usr/src/"] # [<ubicacion de los archivos a copiar>, <destino donde van a quedar los archivos copiados>] WORKDIR /usr/src # es similar al comando cd, WORKDIR <entrar en la siguiente ruta> RUN npm install # RUN ejecuta el comando npm install COPY [".", "/usr/src/"] # [<ubicacion de los archivos a copiar>, <destino donde van a quedar los archivos copiados>] EXPOSE 3000 # le indica al contenedor el puerto por el cual va a salir o exponer el contenedor, es el mismo puerto por donde esta escuchando node CMD ["npx","nodemon", "index.js"] # ejecuta el comando node index.js el cual levanta el servidor de express # npx es una herramienta de cli que nos permite ejecutar paquetes de npm de forma mucho más sencilla # nodemon es el paquete que nos va apermitir bajr y subir el server de manera automatica apenas exita un cambio en los archivos # index.js es el archivo que levanta el servidor de express
El error: Error: Cannot find module 'express’ U otro error de dependencias lo resolvi asi:
Al momento de bajar el proyecto, debido al gitignore el proyecto no tenia la carpetas de los modulos de node. Debido a esto cuando se ejecuta el contenedor la primera vez y al no haber cambios en el package.json y package-lock.json, nunca se ejecutara el npm install.
Puesto que lo que hize fue correr de manera interativa el contenedor -it Esto me permitio ejecutar el comando npm install y debido a que el volumen esta apunto a la carpeta del codigo fuente del host se engeraran todos los modulos necesarios. Una vez esto, se puede descartar dicho contender y ejecutar de nuevo el contenedor con la opcion --rm (para borrar), no iterativo (sin la opcion it)
Saludos
Gracias me sirvió mucho, sólo para poner los pasos.
Primero ejecuten:
sudo docker run -it --rm -p 3000:3000 -v /ruta/donde/estan/docker:/usr/src platziapp bash
Estando dentro del bash:
npm install exit
Y por último ejecuten el comando que pone el profe:
sudo docker run --rm -p 3000:3000 -v /ruta/donde/estan/docker:/usr/src platziapp
De nuevo, muchas gracias
Gracias por la clarificacion @code57 and @vinsmokemau por los pasos en code markup. Tengo algunas perguntas:
Que exactamente se esta removiendo con la flag --rm ?
Entiendo que el -p 3000:3000 esta mapping los puertos fuera de docker. Pero no entiendo que tiene que ver el directorio /usr/src en todo esto. Que es lo que pasa ahi?
En la parte de -v /ruta/donde/estan/docker:/usr/src platziapp despues de el : se refiere a algun directorio magico dentro de Docker? (/usr/src)
si al correr el contenedor con un volumen tipo bind te dio este error
vagrant@lion-server:~/platzi-docker$ docker run --rm -p 3000:3000 -v /home/vagrant/platzi-docker:/usr/src platziapp internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module '/root/.npm/_npx/1/lib/node_modules/nodemon/bin/postinstall' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Function.Module.runMain (internal/modules/cjs/loader.js:831:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3) [nodemon] 2.0.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node index.js` internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module 'express' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/usr/src/index.js:1:17) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3)
es porque no se instalaron las dependencias de node antes ejecuta el contenedor, corre el comando:
npm install
parece que al ejecutar el contenedo con -v sobreescrie el conteniido de la carpeta /usr/src con lo que se encuentre en la carpeta host
Hola disculpa, me podrias indicar en que momento exactamente correr el comando npm install, tengo el mismo error que mencionas en tu comentario pero no se exactamente en que momento correr dico comando, gracias de antemano por tu ayuda.
@joseluisavalosizaguirre ejecuta el comando antes de correr el contenedor
Si están en windows y tienen problemas con la recarga automática por parte de nodemon usen --legacy-watch
Dockerfile:
CMD ["npx", "nodemon", "--legacy-watch", "index.js"]
Estoy corriendo docker sobre windows estoy ejecutando sobre Linux container. La ultima parte no me funciona, cuando hago el cambio no se reinicia el container. Mi configuracion es la siguiente: ++DOCKER FILE++ FROM node:10 COPY ["package.json", "package-lock.json", "/usr/src/"] WORKDIR /usr/src RUN npm install COPY [".", "/usr/src/"] EXPOSE 3000 CMD ["npx", "nodemon", "index.js"]
El monitor no detecta el cambio
D:\DoKR\EJEMPLO1>docker run --rm -p 3000:3000 -v D:\DoKR\EJEMPLO1:\usr\src platziapp
[nodemon] 1.18.6
[nodemon] to restart at any time, enter rs
[nodemon] watching: .
[nodemon] starting node index.js
Server listening on port 3000!
HELP ME!!!!
A pesar de ello no funciona...
Para los que tengan el error
npm ERR! code E404
npm ERR! 404 Not Found: flatmap-stream@0.1.1
solo cambien en su package.json el nodemon a latest
"devDependencies": { ... "nodemon": "latest" }
Muchas gracias, por el aporte ya no tengo problemas.
Para la gente que use Windows pueden reemplazar
C:/ruta/donde/estan/docker por ${PWD}
es una variable global que se puede usar en el shell de Windows para no estar siempre colocando el directorio completo.
quedaria algo asi
docker run --rm -p 3000:3000 -v ${PWD}:/usr/src platziapp
Espero les sirva!
Tuve el error
C:\docker>docker run --rm -p 3000:3000 -v /c/docker:/usr/src platziapp internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module '/root/.npm/_npx/1/lib/node_modules/nodemon/bin/postinstall' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Function.Module.runMain (internal/modules/cjs/loader.js:831:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3) [nodemon] 2.0.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node index.js` internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module 'express' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/usr/src/index.js:1:17) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) [nodemon] app crashed - waiting for file changes before starting...``` luego ejecute
docker run --rm -p 3000:3000 -v /c/docker:/usr/src platziapp npm install
seguia sin funcionar pero la consola sugeria utilizar el audit fix y con ello si funciono
C:\docker>docker run --rm -p 3000:3000 -v /c/docker:/usr/src platziapp npm audit fixnpm + mongodb@3.5.5 added 2 packages from 2 contributors, removed 3 packages and updated 9 packages in 37.451s WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules/fsevents): npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/usr/src/node_modules/.staging/fsevents-8761505b/node_modules/signal-exit’ -> ‘/usr/src/node_modules/.staging/signal-exit-a0d7e7f7’
fixed 135 of 137 vulnerabilities in 2399 scanned packages 1 vulnerability required manual review and could not be updated 1 package update for 1 vulnerability involved breaking changes (use npm audit fix --force to install breaking changes; or refer to npm audit for steps to fix these manually)
Y ahora si funciono!!!! Espero te sea útil
C:\docker>docker run --rm -p 3000:3000 -v /c/docker:/usr/src platziapp [nodemon] 1.18.6 [nodemon] to restart at any time, enter rs [nodemon] watching: . [nodemon] starting node index.js Server listening on port 3000!
A mi me ha funcionado con C:\docker>docker run --rm -p 3000:3000 -v /c/docker:/usr/src platziapp npm audit fix npm + mongodb@3.5.5
De todos los comentarios éste fue el que solucionó el problema. Gracias!
En esa clase me surgió el mismo problema de las dependencias como a todos, lo que yo realice fue que al momento de correr el contenedor, en lugar de instalar directamente con npm install las librerias inicie el bash.
docker run -p 3000:3000 -v /your/directory:/usr/src -it nodeapp bash
Una vez dentro del contenedor corrí el comando
npm install
Me salí del contenedor, como al momento de salirse del contenedor se apaga. Lo inicie con:
docker restart [id de mi contenedor]
ahora entre de nuevo a mi contenedor usando el comando
docker exec -it [id-mi-contenedor] bash
dentro del bash lo que hice fue correr nodemon:
npx nodemon index.js
Y ahora el contenedor ya esta escuchando por cualquier cambio.
Gracias compañero funciono.
Windows 10
Docker file
FROM node:10 COPY ["package.json","package-lock.json", "/usr/src/"] # [<ubicacion de los archivos a copiar>, <destino donde van a quedar los archivos copiados>] WORKDIR /usr/src # es similar al comando cd, WORKDIR <entrar en la siguiente ruta> RUN npm install --force # RUN ejecuta el comando npm install RUN npm audit fix COPY [".", "/usr/src/"] # [<ubicacion de los archivos a copiar>, <destino donde van a quedar los archivos copiados>] EXPOSE 3000 # le indica al contenedor el puerto por el cual va a salir o exponer el contenedor, es el mismo puerto por donde esta escuchando node CMD ["npx", "nodemon", "--legacy-watch", "index.js"] # ejecuta el comando node index.js el cual levanta el servidor de express # npx es una herramienta de cli que nos permite ejecutar paquetes de npm de forma mucho más sencilla # nodemon es el paquete que nos va apermitir bajr y subir el server de manera automatica apenas exita un cambio en los archivos # index.js es el archivo que levanta el servidor de express
Comando:
PS D:\Proyectos\DockerApp> docker build -t platziapp -f Dockerfile .
Siguiente comando:
PS D:\Proyectos\DockerApp> docker run --rm -p 3000:3000 -v D:\Proyectos\DockerApp:/usr/src platziapp
Docker en Windows Si no recarga nodemon automáticamente, usen la solución de Christian
En la parte de: CMD ["npx", "nodemon", "index.js"]
usen:
CMD ["npx", "nodemon", "--legacy-watch", "index.js"]
Busque por todos lados y esta era la parte que estaba fallando :')
Aun no me funciona la recarga ... alguno otra idea ?
El caso del vídeo (en donde de usa nodemon) funciona, pero, en el caso de una aplicación con Java que está en un container com archivos .properties y .xml de configuración... ¿Cómo hago para que se actualice la imagen en tiempo real si cambio algo en la configuración de alguno de esos archivos?
Para estos casos lo que he realizado es integrar Jenkins para construir un CI/CD. De tal modo que los cambios realizados sobre el repositorio de la aplicación activen la compilación y despliegue del código.
No es una solución propíamente del contexto Docker pero en la CI/CD todas las aplicaciones Java se encuentran dockerizadas.
pro tip: por si les falla en el paso de hacer el vinculo con el pc host, ejecuten 'npm install' en el path del proyecto.
en linux: ubunto se inicia todo bien pero cada que hago cambios en el index la información no se actualiza y en el navegador no cambia hasta que no corro un build nuevo y ejecuto el run. yo utilizo una instancia de aws de ubuntu
Hola puedes modificar tu dockerfile asi:
CMD["npx", "nodemon", "--legacy-watch", "index.js"]
con este cambio levantas el container como indica el profesor y ya reconoce los cambios.
Saludos.
Cuando ejecutamos: docker build -t platziapp . Observamos que aparece “Using cache”, esto significa, cómo cada capa es inmutable, cómo docker sabe cual es el comando que genero cada capa. Pero en cada capa, usa lo que hizo las capas anteriores.
Cambiamos el mensaje de salida de la aplicación en el archivo “index.js”, y sí volvemos a ejecutar el comando, vemos que debe hacer todo de nuevo, porque al más minimo cambio de los bits, las capas deben volver a hacerse.
¿Qué podemos hacer para que no nos demande tanto tiempo en cada build? En el dockerfile lo modificamos así:
En el primer COPY voy a colocar únicamente aquellas cosas que afecten al comando npm install, y en node son ; package.json, y package-lock.json.
En el segundo copy sí tal cual como estaba, porque él reconoce que ya se copiaron unos archivos y copia el resto.
Esto nos ayuda mucho cuando estamos desarrollando, para que las dependencias solo se descarguen en una ocasión, y no nos consuma tanto tiempo en los builds.
Cómo actualizar el contenido de un contenedor sin tener que estar dándole build? En el dockerfile, en vez de utilizar en el CMD, node utilizaremos nodemon, lo cual sirve monitorear mis archivos de javascript de mi servidor de node, y cuando los detecta se actualizar.
CMD ["npx", "nodemon", "index.js"]
Le damos en build, y ahora cómo queremos que node se reinice cuando cambiamos algo en nuestro nodejs, entonces vamos a montar los archivos.
docker run --rm -p 3000:3000 -v /home/felipe/Documentos/curso-docker/docker:/usr/src platziapp Abrimos el navegador : localhost:3000 y vemos que está correcto. PERO, ahora modificamos el archivo de index.js y GUARDAMOS, y observamos que en la consola automáticamente se actualizan y abrimos el navegador y está todo correcto.
si alguien tiene un problema con este tipo error [nodemon] starting node index.js internal/modules/cjs/loader.js:638 throw err; ^ la solucion que realice fueron las siguientes instrucciones 1 - npm install 2 - npm audit fix
Y vuelven a hacer docker build y el docker run. esta manera me funciono el servicio
FROM node:10 COPY ["package.json", "package-lock.json", "/usr/src/"] WORKDIR /usr/src COPY [".", "/usr/src/"] EXPOSE 3000 CMD ["npx","nodemon", "-L", "app/index.js"] RUN npm install -g -f RUN npm audit fix
Hacer Build docker build -t platziapp .
Hacer Run
docker run --rm -p 3000:3000 -v pwd[tab] platziapp
me explicarían que hace la lnea docker run --rm -p 3000:3000 -v /User/gvilarino/Dev/git/docker:/user/src platzi
Hola @eversorto.
Creo que el comando por el que preguntas es: (Sin --rm )
docker run -p 3000:3000 -v /User/gvilarino/Dev/git/docker:/user/src platzi
docker run: Permite iniciar un contenedor.
-p: Bandera para exponer los puertos utilizados por un contenedor
3000:3000: Este par mapea el puerto del contenedor al puerto de la maquina huésped:
-v : bandera para montar volúmenes
/User/gvilarino/Dev/git/docker:/user/src platzi : Directorio de tu contenedor mapeado a un directorio de tu maquina huésped.
Espero te sea de utilidad:
Referencias:
Complementando la respuesta que ya existe a esta pregunta.
El flag --rm le dice al contenedor que se destruya cuando el proceso principal pare. Lo que normalmente sucede es que sólo se duerme el contenedor, dejando de esta forma paso a volver a ejecutarlo. Pero en un entorno de pruebas, aprendizaje, etc. Esto sólo nos ocaciona que se llenen de contenedores parados, así que ese flag los elimina en lugar de dejarlos durmiendo.
Puedes ver más de esta información en la documentación que ya pasó el amigo @fernandofh y con el comando man en la consola.
man docker run --rm
man stands for manual.
Si gustas aprender más sobre man y estas utilidades de la consola. Puedes ver el curso de introducción a la terminal y linea de comandos.
npx?
Sí,
Es una herramienta para ejecutar paquetes de NPM
Puedes leer más aquí.
Y puedes tomar la versión más reciente de ese curso aquí.
Buenas comunidad, consulta quiero crear un contenedor, en este caso con Nodejs y Postgres, y dentro de este crear un proyecto de express por ejemplo. Y que se refleje en la carpeta alfitriona cuando creo un archivo o carpeta dentro del contenedor. Estoy tratando y no se refleja en mi carpeta dnd tengo Dockerfile y docker-compose.yml estos son mis archivos: Dockerfile:
docker-compose.yml:
Porque mi idea es tener un entorno de desarrollo donde simplemente corra el contenedor y dentro de este crear proyectos necesarios. Desde ya muchas gracias.! Alejandro
yo te recomendaria trabajar con el feature de vscode llamado developing in containers
https://code.visualstudio.com/docs/remote/containers
¿Cuándo y para que usaría el flag de --rm o -d?
El flag -rm se utiliza para ReMover contenedores: https://linuxize.com/post/how-to-remove-docker-images-containers-volumes-and-networks/.
El flag -d te lo explico aquí: https://platzi.com/comentario/824612/.