Estás sufriendo un problema de "cache busting". Docker cachea las capas de la imagen. Si una capa cambia, todas las que vienen después se invalidan y se vuelven a ejecutar.
La solución es copiar primero solo los archivos que definen las dependencias, instalar las dependencias, y LUEGO copiar el resto del código fuente. Así, si solo cambias tu código, la capa del npm install se aprovecha del caché.
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .Y para el COPY . . lento, usa un archivo .dockerignore para excluir carpetas pesadas que no necesitas en la imagen, como node_modules o .git.