Docker · Dockerfile

Dockerfile

Construisez des images reproductibles avec un Dockerfile clair, versionné et sans secret embarqué.

Leçon disponible
20 min

Objectifs

  • Comprendre les instructions essentielles d’un Dockerfile.
  • Construire et nommer une image avec docker build.
  • Distinguer CMD d’ENTRYPOINT.
  • Appliquer les premières bonnes pratiques de sécurité et de cache.

Construire une image avec un Dockerfile

Un Dockerfile est un fichier texte décrivant les étapes nécessaires à la construction d’une image. Chaque instruction produit un résultat reproductible à condition de maîtriser les sources et versions utilisées.

Le contexte de build correspond au dossier envoyé au builder. Le point final de docker build -t my-nginx:1.0 . indique que le dossier courant est ce contexte.

Les instructions principales

FROM choisit l’image de base. WORKDIR définit le dossier courant. COPY ajoute des fichiers du contexte. RUN exécute une commande pendant le build. ENV définit une variable dans l’image et EXPOSE documente un port prévu.

CMD fournit la commande ou les arguments par défaut au démarrage. ENTRYPOINT définit l’exécutable principal ; les arguments de CMD peuvent alors servir de valeurs par défaut modifiables.

  • FROM doit être la première instruction d’un stage, hors directives de syntaxe et ARG autorisés.
  • RUN agit pendant la construction ; CMD et ENTRYPOINT agissent au démarrage du container.
  • EXPOSE ne publie pas le port vers l’hôte : docker run -p reste nécessaire.

Exemple pratique : une image nginx

Ce Dockerfile part d’une image nginx légère et copie le contenu statique dans le répertoire servi par nginx.

Dockerfile
FROM nginx:alpine

COPY ./html /usr/share/nginx/html

EXPOSE 80
Construire puis lancer l’image versionnée
docker build -t my-nginx:1.0 .
docker run -d -p 8080:80 my-nginx:1.0

Mini exemple applicatif

Cet exemple Node.js installe d’abord les dépendances afin de mieux réutiliser le cache, puis copie le code applicatif. La forme JSON de CMD évite une interprétation supplémentaire par un shell.

Dockerfile applicatif simplifié
FROM node:22-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]

ENTRYPOINT serait pertinent pour imposer un exécutable stable, avec CMD comme arguments par défaut. Le choix dépend de la manière dont l’image doit être utilisée.

.dockerignore et builds multi-stage

.dockerignore exclut du contexte les fichiers inutiles ou sensibles. Un build multi-stage utilise plusieurs FROM et ne copie dans l’image finale que les artefacts nécessaires, ce qui peut réduire taille et surface d’attaque.

Exemple de .dockerignore
node_modules
.git
.env
*.log

Bonnes pratiques

Choisissez une image de base maintenue et adaptée, utilisez des tags explicites en production et réorganisez les instructions pour exploiter le cache sans multiplier les couches inutiles.

  • Ne jamais copier de clé, token ou mot de passe dans l’image ou son historique.
  • Utiliser les secrets de build ou le mécanisme de secrets de la plateforme lorsqu’ils sont nécessaires.
  • Éviter latest comme seule stratégie de version en production.
  • Exécuter l’application avec un utilisateur non-root lorsque l’image et l’application le permettent.

Mini résumé

  • Le Dockerfile décrit la construction reproductible d’une image.
  • RUN s’exécute au build ; CMD et ENTRYPOINT définissent le démarrage.
  • EXPOSE documente un port sans le publier vers l’hôte.
  • .dockerignore, tags explicites et multi-stage améliorent maîtrise et sécurité.

Mini quiz

Trois questions pour vérifier les notions essentielles de la leçon.

1. Quelle différence essentielle existe entre RUN et CMD ?
2. EXPOSE 80 rend-il automatiquement le service accessible sur le port 8080 de l’hôte ?
3. Pourquoi ne faut-il pas copier un secret puis le supprimer dans une étape suivante ?