CI/CD : builder et pousser des images Docker (tags, cache, multi-stage)

CI/CD : builder et pousser des images Docker (tags, cache, multi-stage)

Si tu déploies une API, ton artefact le plus propre est souvent une image Docker.

Mais attention : un mauvais build d'image en CI peut devenir :

  • lent,
  • instable,
  • impossible à reproduire.

On va poser une méthode simple.


La règle d'or : une image versionnée

Tu veux pouvoir dire :

"la prod tourne sur l'image 1.2.3"

Donc on évite de ne publier que latest.

Tags utiles :

  • sha-<commit> (traçabilité parfaite)
  • 1.2.3 (version sémantique)
  • prod / staging (alias pratique)

Multi-stage builds (toujours)

On compile d'un côté, on exécute de l'autre.

FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/dist ./dist
COPY package*.json ./
RUN npm ci --omit=dev
CMD ["node", "dist/main.js"]

Résultat :

  • image plus petite,
  • moins de surface d'attaque,
  • plus rapide à déployer.

Cache : gagner du temps sans tricher

Le secret, c'est l'ordre des COPY.

1) Copier les manifests de deps
2) Installer deps
3) Copier le reste du code

Comme ça, si tu modifies un fichier métier, Docker ne réinstalle pas toutes les deps.


Registry : où tu pushes

Tu peux pousser :

  • sur Docker Hub,
  • sur GHCR (ghcr.io),
  • sur un registry privé.

L'important : que ton cluster (ou ta VM) puisse tirer l'image.


À la fin, l'objectif

Ton pipeline doit sortir une image :

  • reproductible,
  • versionnée,
  • poussée au registry,
  • prête à être déployée (sans rebuild).

Dans l'article suivant, on attaque un sujet critique : les secrets et variables d'environnement en CI/CD (sans fuite).

Articles recommandés