Dockeriser une application NestJS : guide complet
Du Dockerfile à la production sécurisée : la méthode que j'utilise pour containeriser une API NestJS avec builds multi-stage et CI/CD.
Dans mes missions freelance, je containerise systématiquement les applications. Voici la méthode que j'applique pour une API NestJS, avec un build optimisé et un déploiement fiable. Cette démarche suit les recommandations officielles de Docker sur les builds multi-stage et la documentation de NestJS.
Le Dockerfile multi-stage
L'idée : séparer le build de l'exécution pour réduire drastiquement la taille de l'image finale.
# Stage 1 — build
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2 — production
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package*.json ./
EXPOSE 3000
CMD ["node", "dist/main.js"]
Résultat : une image qui passe de ~1,2 Go à ~180 Mo.
Les bonnes pratiques
- Toujours fixer les versions (
node:22-alpine, paslatest). - Utiliser un
.dockerignorepour exclurenode_modules,.git, les tests. - Passer les secrets via variables d'environnement, jamais dans l'image.
- Combiner avec une CI/CD (GitHub Actions) pour builder et pousser l'image automatiquement.
Aller plus loin
Pour la production, j'ajoute généralement un reverse proxy Caddy (HTTPS automatique via Let's Encrypt) devant le conteneur, et un docker-compose.yml pour orchestrer l'API + la base de données PostgreSQL.
Sources officielles
- Docker — multi-stage builds
- Docker — meilleures pratiques de build
- NestJS — documentation officielle
- Node.js — Docker officiel
Envie d'industrialiser vos déploiements ? Parlons-en.