Cómo reducir el tamaño de la imagen en la aplicación Node.js
El repositorio de imágenes de Node.js proporciona múltiples etiquetas de imágenes para cada versión de node.js. Por ejemplo, la versión 8.10.0 tiene seis etiquetas de imagen diferentes:
8.10.0–266 MB comprimido
8.10.0-Alps–23 MB comprimido
8.10 .0-on build: 266 MB comprimidos
8.10.0-ultra-thin: 92 MB comprimidos
8.10.0-stretched: 343 MB comprimidos
8.10.0-Wheezy – 202 MB comprimidos
Lo interesante es esta versión alpina. Esta es la imagen más pequeña disponible ya que está basada en el proyecto Alpine Linux. Alpine usa musl libc en lugar de glibc interno, pero Node.js normalmente usa este último (glibc) en sistemas de desarrollo típicos. Esto puede dañar algunas bibliotecas de funciones que usa, pero mi aplicación basada en Express.js no tiene problemas para cambiar a alpine como se muestra a continuación:
#Reemplace la primera línea de:
Desde el nodo:8.10.0
#Para:
Desde nodo:8.10.0-alps
A continuación, ejecute el comando Docker Build. En mi caso, el tamaño de la imagen se ha reducido a 206 MB, ¡una reducción del 78% respecto al tamaño inicial!
Paso 2: Utilice NPM para producir etiquetas (206 MB reducidos a 79 MB)
De forma predeterminada, npm install instalará todas las dependencias, incluida la sección devDependencies. Usando el indicador -production, podemos instalar solo las dependencias requeridas del archivo package.json. En la sección devDependencies, guardo el sistema de compilación, las herramientas de prueba y algunas otras herramientas de desarrollo. Estoy acostumbrado a mantener la biblioteca React.js en un archivo package.json junto con otras dependencias de la UI, pero esto parece incorrecto ya que tengo un paquete web que genera todas las dependencias de la UI. Entonces, la forma correcta es eliminar todas las dependencias que no se usarán directamente en el servidor de producción o directamente en la sección devDependencies.
* *La regla general es: si una dependencia solo es necesaria durante la construcción, muévala a la sección devDependencies.
**
No empaqueté los archivos del servidor, así que mantuve todas las dependencias del servidor en la sección de dependencias, como antes. Esto significa que el flujo de trabajo debe incluir los siguientes pasos:
Construir el paquete de interfaz de usuario
Copiar el paquete de interfaz de usuario en la imagen de Docker
Copiar los archivos del servidor; a la imagen de Docker;
Copie el archivo package.json a la imagen de Docker;
Ejecute el comando npm install - Production en la imagen;
El final La versión del Dockerfile que obtuve es la siguiente:
Desde el nodo:8.10.0-alps
Ejecute mkdir -p /usr/app/build
Trabajando directorio /usr/app
p>Recibido. /build /usr/app/build
Recibido. /package.JSON/usr/app/package.JSON
Ejecute cd /usr/app&npm install-production
Exposición 3000
CMD ["npm", "run","start"]
Ejecute el comando Docker Build nuevamente.