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.
FROM nginx:alpine
COPY ./html /usr/share/nginx/html
EXPOSE 80docker build -t my-nginx:1.0 .
docker run -d -p 8080:80 my-nginx:1.0Mini 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.
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.
node_modules
.git
.env
*.logBonnes 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.
Erreur fréquente : intégrer un secret dans une couche
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.