Esto no es tanto "mi código es incorrecto" como una pregunta sobre cuál es el mejor enfoque. Estoy creando una pequeña aplicación web basada en Aurelia (usando jspm) y Flask-restful para el backend. Estoy probando cosas diferentes cuando se trata de construir un contenedor Docker para todo esto (por ahora es un contenedor único que contiene tanto el frontend como el backend).
Los 2 enfoques que he probado:
Realice todas las instalaciones de dependencia (npm/jspm) "fuera" del contenedor y simplemente copie todos los artefactos en el contenedor usando la instrucción "COPY" de Dockerfile. Esto funciona bien, pero el "artefacto de compilación" e incluso la lista de todos los archivos es extremadamente lento. Aurelia genera una huella enorme en términos de cantidad de archivos, por lo que la compilación de Docker tarda una eternidad en completarse.
Realice todas las instalaciones de dependencia dentro del contenedor (usando RUN jspm install, etc. en el Dockerfile). Lo bueno de este enfoque es que la computadora host se deja intacta y no tiene ningún requisito excepto git y Docker-engine. El problema es que jspm a menudo falla debido a la limitación de velocidad de git, ya que la mayoría de los paquetes de jspm usan git y no su "propio" repositorio. Para contrarrestar esto, tendría que lidiar con el envío de credenciales de github al contenedor en el momento de la compilación, lo que agrega mucha complejidad.
Un enfoque híbrido donde configuro un "contenedor base" separado usando una etiqueta que incluye "la mayoría" de los paquetes requeridos. Esto, combinado con el n.° 2, me permitiría basar mis compilaciones diarias en una imagen en la que ya se cumplen al menos la mayoría de las dependencias. Tendría que implementar un proceso de compilación separado para mantener actualizado el contenedor base.
Para mayor claridad: mi entorno de desarrollo local está bien, el problema son las compilaciones (muy) lentas en CI, que ponen en cola otros trabajos.
Solo me interesa lo que hace la gente; estoy seguro de que no soy el único que se ha enfrentado al problema de los tiempos de compilación excesivos con Docker y, especialmente, con los marcos frontend con gran cantidad de archivos.
Estoy a favor del enfoque de contenedor en "cascada" (que es una de las mejores características de Docker); esto es básicamente lo mismo que su enfoque híbrido. Aunque nada le impide usar varias imágenes en secuencia en lugar de un solo contenedor base, por supuesto.
Pones en cascada tus compilaciones en función de la jerarquía de tus dependencias. También puede reducir el tiempo de compilación de cada imagen acoplable en la cadena, acelerando sus compilaciones continuas.
La desventaja es que esto introduce más complejidad, ya que requiere una nueva canalización de compilación para cada imagen separada.
Para archivos transitorios como paquetes npm, también prefiero construirlos dentro del contenedor; esto hace que sus imágenes y la configuración de compilación sean más portátiles, aunque normalmente mantengo git fuera de los contenedores y dejo que el contenedor de compilación maneje eso, esto mantiene sus credenciales de git más seguras.
Dices que tus compilaciones son lentas, pero ¿por qué es eso necesariamente un problema? ¿No debería necesitar estar reconstruyendo todo el tiempo una vez que haya configurado los entornos? Simplemente use montajes de volumen para desarrollar contra contenedores en ejecución y deje que el proceso de compilación se inicie en segundo plano cada vez que haya una combinación (o lo que sea) todo manejado por su servidor de compilación.