Partie 3 · Dockerfile
Construire des images avec un Dockerfile
Le Dockerfile est une recette automatisée de création d'image, dans un format propre à Docker. On la déroule avec docker build.
docker build -f <chemin du Dockerfile> <chemin du contexte de build>
Option --tag pour taguer l'image dans la foulée. Le contexte de build est le répertoire dont les fichiers sont disponibles pour COPY. Pour chaque instruction, Docker lance un conteneur intermédiaire et en fige le résultat dans une couche, à partir de l'image de base prise sur le registry.
Exemple du cours :
FROM debian RUN apt-get update RUN apt-get install -y nginx COPY nginx.conf /etc/nginx/conf/nginx.conf
Lecture : partir de l'image debian, mettre à jour l'index des paquets, installer nginx sans interaction (-y), copier le nginx.conf du contexte vers l'image. Quatre instructions donc quatre couches.
Vérifie que tu as compris
apt-get install -y nginx dans un RUN ?Les instructions principales
| Instruction | Rôle (d'après le cours) |
|---|---|
FROM <image> | image de base ; un seul FROM par Dockerfile (dans le cours) |
RUN <commande> | exécute une commande shell (lancée par sh), sans interaction |
LABEL version="1.0" | applique un label, utile avec docker images --filter |
ENV key=value | variable d'environnement valable au build et à l'exécution des conteneurs |
COPY src dest | copie un fichier / répertoire du contexte vers l'image ; --chown pour les droits |
ADD src dest | comme COPY, plus : une archive est décompressée, la source peut être une URL |
WORKDIR dir | change le répertoire courant, base des RUN suivants |
EXPOSE 80/tcp | indique le port d'écoute du processus ; métadonnée, sans effet direct sur le réseau |
VOLUME chemin | déclare un volume externe, résolu au run ; les fichiers existants sont ajoutés au volume monté |
USER user:group | définit uid et gid dans le conteneur ; attention aux volumes partagés avec l'hôte |
ENTRYPOINT [...] | commande de démarrage ; elle obtient le PID 1 et reçoit les signaux (ex. SIGTERM) ; par défaut /bin/sh -c |
CMD [...] | arguments par défaut passés à l'ENTRYPOINT |
Vérifie que tu as compris
EXPOSE 80/tcp ?Vérifie que tu as compris
Exemple de lecture avec ENTRYPOINT / CMD (exemple ajouté, formes tirées du cours) :
FROM debian RUN apt-get update && apt-get install -y apache2 ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Au démarrage, le processus apache2ctl devient PID 1 et reçoit SIGTERM à l'arrêt ; -D FOREGROUND le garde au premier plan, sinon le conteneur s'arrêterait.