Skip to content

perf: Dockerfile multi-stage (750MB -> 272MB)#158

Merged
mortifia merged 1 commit into
mainfrom
perf/millstone-multistage-image
Jul 15, 2026
Merged

perf: Dockerfile multi-stage (750MB -> 272MB)#158
mortifia merged 1 commit into
mainfrom
perf/millstone-multistage-image

Conversation

@mortifia

@mortifia mortifia commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Résumé

  • L'image finale gardait tout le npm install (devDependencies incluses : nuxt, prisma CLI, types) alors que .output/ (bundle Nitro généré par nuxt build) est autonome et trace déjà ses propres dépendances runtime.
  • Passage en multi-stage : le stage build installe/génère/build comme avant, le stage final ne copie que .output/ et lance node .output/server/index.mjs directement (plus besoin du CLI nuxt pour npm run start, absent du stage final).
  • .env et .output ajoutés à .dockerignore (.env n'était pas exclu du contexte de build jusqu'ici).

Risque identifié et vérifié

Nitro trace les dépendances utilisées par le serveur, mais Prisma (moteur natif) et bcrypt (binding natif) sont des cas connus où cette détection automatique peut échouer. Vérifié explicitement avant d'ouvrir cette PR plutôt que de supposer que ça marche :

  • .output/server/node_modules/.prisma et @prisma présents, avec le moteur natif libquery_engine-debian-openssl-3.0.x.so.node
  • binding natif bcrypt présent
  • conteneur démarré réellement sur le VPS : GET /api/task (route non authentifiée qui fait une vraie requête Prisma) répond 200 {"tasks":[]}, GET / répond 200

Mesures

Taille de l'image : 750MB -> 272MB (-64%)

Test plan

  • Build multi-stage réussi (--no-cache)
  • Présence vérifiée des binaires natifs Prisma/bcrypt dans l'image finale
  • Conteneur démarré, requête Prisma réelle testée en direct (/api/task)
  • Redéploiement en prod (pas fait dans cette PR — à planifier séparément)

Closes #159

npm install complet (incl. devDependencies : nuxt, prisma CLI, types) restait
dans l'image finale alors que .output/ (bundle Nitro) est autonome et trace
déjà ses propres dépendances runtime (Prisma + moteur natif, bcrypt).

Le stage final ne copie que .output/ et lance directement node dessus (plus
besoin du CLI nuxt pour npm run start). Ajout de .env et .output à
.dockerignore par la même occasion (.env n'était pas exclu du contexte de
build).

Testé sur le VPS (build --no-cache + run réel) :
- .prisma/client, @prisma/client et le moteur natif
  (libquery_engine-debian-openssl-3.0.x.so.node) présents dans
  .output/server/node_modules
- binding natif bcrypt présent
- conteneur démarré, GET /api/task renvoie 200 avec une vraie requête Prisma
- GET / renvoie 200

Taille : 750MB -> 272MB.
@mortifia
mortifia merged commit c2bf1ea into main Jul 15, 2026
2 checks passed
@mortifia
mortifia deleted the perf/millstone-multistage-image branch July 15, 2026 06:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optimiser la taille de l'image Docker (multi-stage)

1 participant