El problema principal es que estás copiando todas las dependencias de desarrollo (devDependencies) en la imagen final. La solución estándar para esto es usar multi-stage builds.
La idea es tener una primera "etapa" para construir la aplicación, y una segunda, mucho más ligera, que solo copia los artefactos necesarios para ejecutarla. Así las herramientas de build y las devDependencies no llegan a la imagen final. Es un cambio de día y de noche.