Esto surge de vez en cuando en varios de nuestros equipos de desarrollo, sin que hayamos descubierto la forma "correcta":
Usamos muchas aplicaciones web basadas en reacciones que se "compilan" en sitios web estáticos que son solo unos pocos archivos html, js y css.
Sin embargo, la "construcción" de estas aplicaciones toma una serie de variables que habilitan / deshabilitan las marcas de función, configuran las URL de backend, etc. Esto significa que no podemos "construir" un binario en el sentido tradicional y simplemente aplicar un archivo de configuración en la implementación. tiempo: la "compilación" en sí misma necesita tener estas variables específicas del entorno establecidas y, por lo tanto, el único momento en que podemos "construir" es en el momento de la implementación.
Por ahora resolvemos esto inyectando las variables de entorno requeridas en el contenedor Docker y ejecutamos un cmd de inicio a lo largo de las líneas de
npm build && nginx run
Esto tiene un par de desventajas:
- El proceso de compilación toma mucha CPU / memoria en relación con los requisitos de tiempo de ejecución del contenedor. Eso significa que necesitamos escalar el contenedor para el proceso de compilación en lugar de los requisitos de tiempo de ejecución, lo que se siente mal
- Las fallas de construcción son difíciles de "rastrear". Podemos usar verificaciones de salud en Kubernetes, pero si una construcción demora 2 minutos, todavía tenemos que esperar 3 minutos (1 extra por seguridad) antes de que podamos comenzar a probar el punto final de verificación de salud del contenedor para ver si está vivo.
- Las implementaciones pueden llevar mucho tiempo: si configuramos Kubernetes para que realice una implementación "en serie", iniciará cada pod y esperará el período de "retraso inicial" de 2-3 minutos antes de comenzar el siguiente. Esto significa que estamos viendo fácilmente un tiempo de implementación de 10 minutos si la implementación se escala a 3-4 pods.
Todo esto me parece muy subóptimo. Me interesaría saber cómo la comunidad resuelve el enigma de "compilar en el momento de la implementación" con aplicaciones web modernas de JavaScript.
Me doy cuenta de que para Kubernetes podríamos usar "contenedores de inicio" que realizan la compilación, colocan los artefactos en un almacenamiento persistente y luego hacen que los contenedores de la aplicación simplemente se extraigan del almacenamiento persistente durante el inicio, pero esto todavía parece más como "pasar por alto" el problema que resolviendo el problema raíz.
npm build
es solo un comando arbitrario. Podría ser react build
o sanity build
lo que sea que el marco JS espera. Nos vemos obligados a hacerlo en el despliegue de contenedores porque es cuando conocemos el entorno build
.
npm build
en tiempo de ejecución en lugar de durante la construcción del contenedor?