Leçon 4 / 8
Leçon 04 · Partie 1 — Les bases

Le Dockerfile

C'est quoi un Dockerfile ?

Un Dockerfile est un fichier texte avec des instructions qui décrivent comment construire une image Docker. C'est le "plan de construction" de ton image. Chaque instruction crée une couche (layer) dans l'image finale.

Tu écris un Dockerfile, tu le builds avec docker build, et tu obtiens une image que tu peux lancer, partager et déployer partout.

Les instructions essentielles

Dockerfile
# Image de base — point de départ
FROM node:20-alpine

# Répertoire de travail dans le conteneur
WORKDIR /app

# Copier les fichiers de dépendances
COPY package*.json ./

# Installer les dépendances
RUN npm install --production

# Copier le reste du code source
COPY . .

# Exposer le port de l'application
EXPOSE 3000

# Commande lancée au démarrage du conteneur
CMD ["node", "server.js"]

Les instructions détaillées

  • FROM — image de base. Toujours en premier. Utilise des images officielles légères (alpine).
  • WORKDIR — définit le répertoire courant pour les instructions suivantes.
  • COPY src dest — copie des fichiers depuis ton système vers l'image.
  • RUN — exécute une commande pendant le build (install, compile…). Crée une couche.
  • EXPOSE — documente le port écouté (informatif — n'ouvre pas réellement le port).
  • CMD — commande exécutée quand le conteneur démarre. Une seule CMD par Dockerfile.
  • ENV KEY=value — définit une variable d'environnement.
  • ARG — variable disponible uniquement pendant le build.

Builder et lancer l'image

Terminal
# Builder l'image depuis le Dockerfile du répertoire courant
# -t = tag (nom:version)
docker build -t mon-app:1.0 .

# Lancer le conteneur
docker run -d -p 3000:3000 mon-app:1.0

# Voir les couches de l'image
docker history mon-app:1.0

Le layer caching — accélérer le build

Docker met en cache chaque couche. Si une couche n'a pas changé, il la réutilise lors du prochain build. C'est pourquoi l'ordre des instructions compte.

Bonne pratique : copie les fichiers qui changent rarement (package.json) en premier, puis installe les dépendances, puis copie ton code source. Ainsi, la couche d'installation des dépendances est réutilisée tant que package.json ne change pas.

💡

Dans l'exemple ci-dessus, on copie package*.json AVANT de copier tout le code. Résultat : si tu modifies uniquement ton code source, Docker réutilise la couche npm install depuis le cache — le build est beaucoup plus rapide.

Le fichier .dockerignore

Comme .gitignore, le .dockerignore exclut des fichiers du contexte de build. Sans lui, docker build envoie tout ton répertoire au daemon — incluant node_modules et .git.

.dockerignore
node_modules
.git
.env
*.log
dist
coverage
.DS_Store
// À retenir
  • Dockerfile = instructions pour builder une image. Chaque instruction = une couche.
  • FROM → image de base, WORKDIR → répertoire, COPY → fichiers, RUN → commandes, CMD → démarrage.
  • docker build -t nom:tag . construit l'image depuis le Dockerfile du répertoire courant.
  • Copie package.json avant le reste du code pour profiter du cache des dépendances.
  • Ajoute un .dockerignore pour exclure node_modules, .git, .env.