¿Cómo funciona el Layer Cache de Docker y cómo optimizarlo?
Docker es una herramienta poderosa que nos permite optimizar nuestro flujo de trabajo mediante el concepto de Layer Cache. El Layer Cache permite que Docker recuerde las capas (layers) que ha construido previamente, ahorrando tiempo al no reconstruirlas si no hay cambios. Imagina la eficiencia que puedes lograr al no tener que repetir tareas que ya has realizado.
¿Cuándo se invalida el Layer Cache?
Un cambio en la base de una imagen resulta en la invalidación del cache de todo lo que deriva de esta base. Por ejemplo, si decides cambiar la versión de Node en tu aplicación de la 12 a la 14, Docker tiene que reconstruir la imagen completa desde cero. Aunque Docker es consciente de las capas existentes y puede reutilizar las imágenes que ya tienes, modificar la base hace que todo deba ser re-evaluado.
¿Cómo estructurar un Dockerfile para aprovechar el cache?
En desarrollo, es común cambiar código con frecuencia para probar nuevas funcionalidades. La estructura de tu Dockerfile es clave para optimizar el uso del cache:
Copia solo lo necesario: Al copiar archivos en tu Dockerfile, comienza por aquellos esenciales, como package.json y package.lock.json. Estos archivos son suficientes para ejecutar npm install.
Minimiza cambios en capas esenciales: Coloca las instrucciones que cambian con más frecuencia, como copiar el resto de tu código, después de las instrucciones que generan costos significativos como npm install.
Este enfoque reduce el tiempo de reconstrucción, permitiendo que solo las capas afectadas se actualicen.
¿Cómo evitar rebuild tras cambiar el código?
El rebuild manual después de cada cambio puede ser tedioso. Aquí es donde BindMounts y herramientas como nodemon entran en juego:
BindMount: Permite compartir el código entre tu máquina local y el contenedor. Esto asegura que los cambios sean reflejados en tiempo real sin reconstruir toda la imagen de Docker.
Nodemon y nodo: Estas herramientas son perfectas para un entorno de desarrollo. Usar nodemon permite monitorizar tus archivos de código y reiniciar el servidor automáticamente al detectar cambios.
Docker Run se modifica de esta forma para implementar BindMount:
docker run --rm -p 3000:3000 -v $(pwd)/index.js:/app/index.js platzi_app
¿Qué problemas surgen al usar BindMount?
Un error común al usar BindMount es sobrescribir las dependencias del contenedor al montar todo el directorio local. Esto se resuelve montando solo los archivos necesarios, como el index.js, evitando conflictos de dependencias.
Montar archivos específicos en lugar de directorios enteros y solucionar problemas de dependencias con npm install son tareas cruciales previas para un entorno de desarrollo eficiente.
Una planificación cuidadosa y el uso de herramientas disponibles optimizan tu flujo de desarrollo considerablemente, permitiéndote centrarte en el código sin preocuparte por innecesarios tiempos de espera. ¡Adelante, sigue aprendiendo y mejorando tus habilidades en Docker!