recientemente , un nuevo administrador de paquetes de creado sobre el registro npm, que reduce enormemente los tiempos de instalación y envía una compilación determinista lista para usar. Facebook lanzó Yarn Node.js El determinismo siempre ha sido un problema con npm, y las soluciones como no . Esto dificulta el uso de un sistema basado en para múltiples desarrolladores y en integración continua. Además, la lentitud de en el caso de archivos complejos provoca tiempos de compilación prolongados, lo que representa un obstáculo importante cuando se usa Docker para el desarrollo local. npm shrinkwrap funcionan bien npm npm package.json Este artículo analiza cómo usar Yarn con Docker para el desarrollo y la implementación de Node.js. asume el código de instalación xkcd TL;DR Clonar el repetitivo: clon de git https://github.com/mfornasa/DockerYarn.git Ingrese al directorio: cd Docker Yarn Construye el contenedor: ./construir.sh Ejecutarlo: docker ejecuta yarn-demo node -e "console.log('Hello, World')" La primera vez que crea el contenedor, Yarn obtiene las dependencias de por usted. Después de eso, Yarn se ejecuta solo cuando modifica su y usa el caché de ejecuciones anteriores. Además, tiene : el mismo árbol de dependencia se instala cada vez y en cada máquina. ¡Y ! npm package.json determinismo es increíblemente rápido Empecemos El procedimiento funciona en Mac y Linux. Vamos a la imagen Node.js Docker para Node 6. en su máquina antes de continuar. Risingstack Instale Yarn Descargue el paquete de instalación de Yarn en una carpeta local: wget https://yarnpkg.com/latest.tar.gz Cree un nuevo : Dockerfile DESDE risestack/alpino: 3.4-v6.7.0-4.0.0 WORKDIR /opt/aplicación # Instalar hilo desde el local .tgzRUN mkdir -p /optADD Latest.tar.gz /opt/RUN mv /opt/dist /opt/yarnENV PATH "$PATH:/opt/yarn/bin" # Instalar paquetes usando YarnADD package.json /tmp/package.jsonRUN cd /tmp && yarnRUN mkdir -p /opt/app && cd /opt/app && ln -s /tmp/node_modules Esto se basa en un truco para hacer uso del almacenamiento en caché de capas de Docker para evitar reinstalar todos sus módulos cada vez que construye el contenedor. De esta manera, Yarn se ejecuta (y la primera vez, por supuesto). bien conocido solo cuando cambia **package.json** Paquete package.json inicio de hilo Añade tu primer paquete: añadir hilo reaccionar Cree y ejecute su nuevo contenedor: construcción de la ventana acoplable. -t yarn-demodocker ejecutar yarn-demo node -e "console.log('Hello, World')" ¡Felicidades! Estás usando con Docker. yarn ¡Esperar! ¿Qué pasa con " ? yarn.lock” Yarn almacena la versión exacta de cada paquete y subpaquete para poder reproducir exactamente el mismo árbol de dependencias en cada ejecución. Tanto como deben verificarse en el control de código fuente. Mientras ejecutamos Yarn dentro del contenedor, necesitamos recuperar . Afortunadamente, no es difícil extraer después de cada ejecución. Simplemente cambie la línea en el con lo siguiente: package.json yarn.lock yarn.lock yarn.lock ADD Dockerfile AGREGAR paquete.json yarn.lock /tmp/ y construya el contenedor usando el siguiente comando: construcción de la ventana acoplable. -t hilo-demostración; docker run --rm --entrypoint cat yarn-demo:latest /tmp/yarn.lock > yarn.lock Después de la compilación, se copia en su directorio de trabajo y se reutilizará en la próxima ejecución de Docker, instalando las mismas dependencias cada vez. yarn.lock ¡Felicidades! Ahora tienes una ejecución de Yarn. determinista ¡Esperar! Ahora Yarn se ejecuta en cada construcción de contenedor Eso es correcto, ahora estamos ejecutando Yarn en cada compilación, incluso si no se ha modificado . Esto se debe a que se copia del contenedor a su directorio de trabajo cada vez, incluso si no se modifica, lo que invalida el almacenamiento en caché de la capa de Docker. Para resolver esto, necesitamos copiar solo si realmente ha cambiado. Para hacerlo: package.json yarn.lock yarn.lock Cree un archivo : build.sh #!/bin/bash construcción de la ventana acoplable. -t hilo-demostración docker run --rm --entrypoint cat yarn-demo:latest /tmp/yarn.lock > /tmp/yarn.lockif ! diff -q hilo.bloqueo /tmp/hilo.bloqueo > /dev/null 2>&1; thenecho "Tenemos un nuevo yarn.lock"cp /tmp/yarn.lock yarn.lockfi Hazlo ejecutable: chmod +x construir.sh Úselo para construir el contenedor: ./construir.sh Luego ejecuta el contenedor: docker ejecuta yarn-demo node -e "console.log('Hello, World')" ¡Felicidades! Ahora tiene una ejecución de Yarn, y Yarn se ejecuta . determinista solo cuando cambia **package.json** ¿Qué pasa con el caché del paquete Yarn? Otra característica poderosa de Yarn es el caché de paquetes, que se almacena en el sistema de archivos local, para evitar descargar paquetes nuevamente. Nuestro procedimiento hasta ahora no mantiene la memoria caché sobre las compilaciones de contenedores. Esto podría ser un problema para los archivos grandes de . package.json El siguiente resuelve el problema al guardar el caché de Yarn en su directorio de trabajo. build.sh #!/bin/bash # Inicializar archivo de caché vacío si [! -f .hilo-caché.tgz ]; thenecho "Iniciar vacío .yarn-cache.tgz"tar cvzf .yarn-cache.tgz --files-from /dev/nullfi construcción de la ventana acoplable. -t hilo-demostración docker run --rm --entrypoint cat yarn-demo:latest /tmp/yarn.lock > /tmp/yarn.lockif ! diff -q hilo.bloqueo /tmp/hilo.bloqueo > /dev/null 2>&1; thenecho "Guardar caché de hilo" docker run --rm --entrypoint tar yarn-demo:latest czf - /root/.yarn-cache/ > .yarn-cache.tgzecho "Guardar hilo.bloquear"cp /tmp/yarn.lock hilo.lockfi También debe agregar esto a su , después de la línea : Dockerfile ADD package.json... # Copie el contenido del caché (si lo hay) de la máquina localADD .yarn-cache.tgz / El archivo de caché no debe enviarse al repositorio, por lo que debe agregarse a un archivo . .gitignore ¡Felicidades de nuevo! Ahora tiene una ejecución de Yarn , que se ejecuta y utiliza el almacenamiento en . Pruebe esto con un archivo complejo de un proyecto real, ¡se sorprenderá! determinista solo cuando cambia **package.json** caché de Yarn package.json Para obtener más artículos sobre DevOps y Docker, únase a mi . Si disfrutó de esta pieza, haga clic en el botón " ♥︎ " a continuación. lista de correo