Só acrescentaria que o npm ci deve ser utilizado primariamente em processos de automações que incluem: plataformas de testes, integrações contínuas e implantação em ambiente produtivo. Você utiliza nesses ambientes porque você quer evitar problemas na automação. Em ambiente de desenvolvimento ainda é recomendado utilizar o npm install.

No npm ci você quer replicar exatamente um ambiente que já está validado com todas as suas dependências e subdependências. Você não quer correr o risco de atualizar alguma dependência na árvore do ESLint e não conseguir gerar a build. Também é por isso que você só deve utilizar o comando npm ci em ambientes automáticos ou de implantação, você precisa sempre validar as vulnerabilidades e bugs do seu código em ambiente de desenvolvimento.

Faz bastante sentido, costumo ver bastante nos Dockerfile de vários projetos que tem esse arquivo de exemplo para deploy.

Sim, é isso mesmo, o npm ci seria pra esses ambientes onde você não quer experimentar uma possivel atualização de subdependencia que acaba quebrando alguma feature, e na propria documentação do npm eles comentar sobre usar nos ambientes de testes automatizados, builds e etc.

https://docs.npmjs.com/cli/v8/commands/npm-ci