Maintenant que nous connaissons les commandes pour gérer les images nous allons nous intéresser au fichier Dockerfile qui décrit chaque modifications que nous voulons appliquer à nos images pour arriver au résultat attendu.


Définition : Le Dockerfile est la représentation d’une image et de sa construction à partir d’une autre image, le tout en utilisant des instructions de la forme « CLÉ valeur« . Ensuite il suffira de lancer la commande build pour construire ou re-construire notre image.

La syntaxe Dockerfile

Les Clés de la syntaxe sont les suivantes :

  • FROM : définit l’image sur laquelle on va s’appuyer pour créer notre image. Cette image peut être une image officielle ou bien une de vos images. Cette instruction est toujours la première du fichier Dockerfile.
  • # Ceci est un commentaire. Abusez-en !!!!
  • MAINTAINER : indique la personne qui a créé ou maintient ce Dockerfile.
  • RUN : exécute une commande sur l’image courante. Chaque instruction RUN va créer une nouvelle image temporaire qui sera utilisé dans le cas de modification ultérieur de votre Dockerfile. Cela permet accélérer le temps de construction de nouvelles images.
  • EXPOSE : indique quelle sont le ou les port(s) qui pourront communiquer avec l’extérieur.
  • ENV : permet d’affecter une valeur à une variable d’environnement.
  • ADD : permet de copier de nouveaux fichiers, dossiers locaux ou des fichiers distant pour les ajouter dans le système de fichier du conteneur selon le chemin indiqué. On peut utiliser des archives qui si le format est reconnu sera décompressé à la volée. Utile pour copier des sources d’applications.
  • COPY : copie des fichiers, des dossiers et les ajoute dans le système de fichier indiqué. Contrairement à ADD impossible d’ajouter une URL ou de demander la décompression d’une archive.
  • CMD : Cette clé est unique et si il y en a plusieurs seule la dernière sera utilisé. CMD définit la commande a exécuter lors du lancement d’un conteneur. Cette option peut être surchargé par la commande docker run.
  • ENTRYPOINT : Indique la commande par défaut qui sera lancé au démarrage du conteneur. Comme pour CMD cette clé est unique et si il y en a plusieurs, seul le dernier sera pris en compte. Contrairement à CMD ENTRYPOINT ne peut pas être surchargé par la commande “docker run”. Info importante les arguments passés lors de la commande “docker run” seront utilisés en arguments à la commande spécifiée dans l’instruction ENTRYPOINT.
  • VOLUME : ajoute un/des filesytem(s) aux conteneurs à partir de dossier locaux. Ces volumes peuvent être partagés et réutilisés dans différents conteneurs. On peut les utiliser par exemple pour que les conteneurs puissent accéder à du code source, une base de données.
  • USER : désigne quel utilisateur lancera les prochaines instructions RUN ou ENTRYPOINT. Très util pour éviter d’utiliser l’utilisateur root à toutes les sauces.
  • WORKDIR : définit le répertoire de travail qui sera utilisé pour le lancement des commandes ENTRYPOINT et/ou CMD.
  • ONBUILD – cette instruction ajoute des triggers aux images. Un trigger est exécuté lorsque l’image est utilisée pour construire une autre image. Le déclencheur lance une instruction lors de la construction de la nouvelle image comme si elle avait été spécifié juste après le FROM.

Exemple de DockerFile

Nous allons utiliser un fichier mis à dispostion par pilwon sur Ghithub. J’ai pris cette exemple car il est assez caractéristique et comme je l’ai dit il y a des commentaires. Allons-y expliquons en le code :


# Nginx Dockerfile
#
# https://github.com/dockerfile/nginx
#
# Pull base image.
FROM dockerfile/ubuntu

Il utilise la dernière image officielle d’Ubuntu.

# Install Nginx.
RUN
add-apt-repository -y ppa:nginx/stable &&
apt-get update &&
apt-get install -y nginx &&
rm -rf /var/lib/apt/lists/* &&
echo "ndaemon off;" >> /etc/nginx/nginx.conf &&
chown -R www-data:www-data /var/lib/nginx

Lancement de l’installation de nginx. Vous remarquerez la présence de plusieurs commandes enchaînées par la présence de &&. Pour rappel && est utilisé pour enchainer des commandes et la prochaine commande n’est exécuté que si la première sort avec un code retour 0. Cet enchaînement de commande est utilisé ici pour éviter de créer trop d’images lors de la construction de notre image. Par contre cette commande sera lancé dans son intégralité lors de chaque re-build. Je vous conseille de ne chaîner vos commandes que lorsque la mise au point de votre image sera totalement terminé.

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

On monte des répertoires locaux pour paramétrer, déposer les logs et utiliser le code source qui seront utilisé par Nginx

# Define working directory.
WORKDIR /etc/nginx

La prochaine commande utilisera ce répertoire de travail.

# Define default command.
CMD ["nginx"]

Commande lancée lors du docker run. Cette commande pourra être surchargée.

# Expose ports.
EXPOSE 80
EXPOSE 443

Ouverture des ports 80 et 443.

Pour lancer la création d’une image il faut utiliser la commande suivante :
docker build [OPTIONS] PATH | URL | -

–force-rm=false : Toujours supprimer les images intermédiaires lors d’échec de constructions d’images
–no-cache=false  : Ne pas utiliser de cache lors de la création d’une image
-q, –quiet=false  : Suppresion du mode verbose
–rm=true  : Suppression des images intermédiaires lors de construction avec succès
-t, –tag= » » Définit le nom à appliquer à notre image lors de construction avec succès

Pour lancer la commande contruction vous pouvez utiliser la syntaxe suivante :

docker build .

docker utilisera le Dockerfile présent dans le répertoire actuel ou

docker build - < /chemin/nom_du_Dockerfile

Voila terminé l’explication de la syntaxe. A vos Dockerfiles.