Proceso de compilation Docker para interfaces de JavaScript con toneladas de dependencies

Esto no es tanto "mi código está mal", ya que es una pregunta sobre cuál es el mejor enfoque. Estoy construyendo una pequeña aplicación web basada en Aurelia (usando jspm) y Flask-restful para el back-end. Estoy intentando cosas diferentes cuando se trata de build un contenedor Docker para todo esto (por ahora es un contenedor único que contiene frontend y back-end).

Los 2 enfoques que he probado:

  1. Realice todas las instalaciones de dependencia (npm / jspm) "fuera" del contenedor y simplemente copie todos los artefactos en el contenedor utilizando la statement "COPY" de Dockerfile. Esto funciona bien, pero el "artefacto de compilation" e incluso la list de todos los files es extremadamente lento. Aurelia genera una gran huella en términos de cantidad de files, por lo que Docker tarda una eternidad en completarse.

  2. Realice todas las instalaciones de dependencia dentro del contenedor (usando RUN jspm install etc en Dockerfile). Lo bueno de este enfoque es que la computadora host no se toca y no tiene ningún requisito, excepto git y Docker-engine. El problema es que jspm a menudo falla debido a la limitación del índice de git, ya que la mayoría de los packages jspm usan git y no su repository "propio". Para contrarrestar esto, tendría que lidiar con el envío de cnetworkingenciales de github al contenedor en el momento de la compilation, lo que agrega mucha complejidad.

  3. Un enfoque híbrido donde configuro un "contenedor base" separado usando una label que incluye "la mayoría" de los packages requeridos. Esto combinado con el # 2 me permitiría basar mis comstackciones diarias en una image donde al less la mayoría de las dependencies ya se cumplen. Tendría que implementar un process de construcción separado para mantener el contenedor base actualizado.

Para mayor claridad: mi entorno de desarrollo local está bien, el problema son las construcciones (muy) lentas en CI, que ponen en queue otros trabajos.

Simplemente estoy interesado en lo que las personas están haciendo, estoy seguro de que no soy el único que se ha enfrentado al problema de los times de compilation excesivos con Docker y especialmente con frameworks frontend de files pesados.

Estoy a favor del enfoque de contenedor 'en cascada' (que es una de las grandes características de Docker); esto es básicamente lo mismo que su enfoque híbrido. Aunque nada le impide tener varias imágenes utilizadas en secuencia en lugar de tener solo un contenedor base, por supuesto.

Conecta sus comstackciones según la jerarquía de sus dependencies. También puede networkingucir el time de compilation de cada image de acoplador en la cadena, acelerando sus comstackciones continuas.

Lo malo es que esto introduce más complejidad ya que requiere una nueva línea de construcción para cada image separada.

Para files transitorios como npm, también estoy a favor de buildlos dentro del contenedor, esto hace que las imágenes y la configuration de compilation sean más portátiles, aunque normalmente guardo git fuera de los contenedores y dejo que el contenedor de compilation lo maneje, esto mantiene su security auditiva más segura.

Usted dice que sus comstackciones son lentas, pero ¿por qué es necesariamente un problema? ¿No debería necesitar rebuild todo el time una vez que haya configurado los entornos? Solo use monturas de volumen para desarrollarlas contra contenedores en ejecución y deje que el process de compilation se inicie en segundo plano cada vez que haya una combinación (o lo que sea) manejada por su server de compilation.