M242_1 Virtualisation et conteneurisation
Dr Oussama SMIMITE
[Link]@[Link]
Le processus de build Docker
Exemple de Dockerfile
FROM debian:latest
RUN apt update && apt install -y htop
CMD ['sleep 1000']
La commande pour construire l’image est :
docker build [-t tag] [-f dockerfile] <build_context>
Exemple :
docker build -t mondebian .
Le Dockerfile est un fichier procédural qui permet de décrire
l’installation d’un logiciel (la configuration d’un container) en enchaînant
des instructions Dockerfile .
Dockerfile - les Instructions
Instruction FROM
L’image de base à partir de laquelle est construite l’image actuelle.
FROM ubuntu:22.04
FROM alpine:3.5
FROM busybox
Dockerfile - les Instructions
Instruction RUN
Permet de lancer une commande shell (installation, configuration).
RUN apt update && apt install -y htop
RUN apt-get install -y nodejs
Dockerfile - les Instructions
Instruction ADD
Permet d’ajouter des fichier depuis le contexte de build à l’intérieur du conteneur.
Généralement utilisé pour ajouter le code du logiciel en cours de développement et sa
configuration au conteneur.
ADD <src> … <dest>
ADD /source/file/path /destination/path
ADD [Link] /destination/path
ADD [Link] /temp
Dockerfile - les Instructions
Instruction COPY
Contrairement à la commande ADD , COPY n'a qu'une seule fonction assignée. Son rôle est de
dupliquer les fichiers/répertoires dans un emplacement spécifié dans leur format existant .
COPY <src> … <dest>
COPY /source/file/path /destination/path
Dockerfile - les Instructions
Instruction ENTRYPOINT et CMD
Pour faire simple ces deux mots-clés exécutent une commande lorsque que le conteneur
est lancé .
Dockerfile - les Instructions
ENTRYPOINT
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
ENTRYPOINT ["node", "-v"]
docker build -t ubuntu_nodejs_ENT .
Maintenant, lançons le conteneur
docker run --rm ubuntu_nodejs_ENT
v8.10.0
# La version de [Link] installé.
Ajouter ENTRYPOINT ["node", "-v"] équivaut à demander à Docker de lancer la commande
node -v après la création de notre conteneur.
Dockerfile - les Instructions
CMD
Modifions le Dockerfile et remplaçons ENTRYPOINT par CMD.
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
CMD ["node", "-v"]
Construisons l'image correspondante.
docker build -t ubuntu_nodejs_CMD .
Enfin lançons un conteneur.
docker run --rm ubuntu_nodejs_CMD
v8.10.0
Dockerfile - les Instructions
Différence entre ENTRYPOINT et CMD
docker run --rm ubuntu_nodejs_ENT node -h
# ENTRYPOINT
v8.10.0
docker run --rm ubuntu_nodejs_CMD node -h
# CMD
NODE_NO_WARNINGS set to 1 to silence process warnings
NODE_NO_HTTP2 set to 1 to suppress the http2 module
NODE_OPTIONS set CLI options in the environment
via a space-separated list
NODE_PATH ':'-separated list of directories
prefixed to the module search path
NODE_PENDING_DEPRECATION set to 1 to emit pending deprecation
warnings
NODE_REPL_HISTORY path to the persistent REPL history
file
NODE_REDIRECT_WARNINGS write warnings to path instead of
stderr
OPENSSL_CONF load OpenSSL configuration from file
Documentation can be found at [Link]
Dockerfile - les Instructions
Utiliser les deux mot-clés ENTRYPOINT et CMD
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
ENTRYPOINT ["node"]
CMD ["-v"]
Dockerfile - les Instructions
LABEL
Le LABEL ajoute des métadonnées à notre image.
L'utilisation est simple. Il suffit d'utiliser une clé et une valeur.
Nous allons modifier notre Dockefile.
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
LABEL description="Une image pour tester"
LABEL version="1.0.0"
Pour afficher les métadonnées on utilise :docker inspect
docker build -t ubuntu_nodejs_label .
docker inspect ubuntu_nodejs_label
Dockerfile - les Instructions
ENV
L'instruction ENV permet de gérer des variables d'environnement.
Ajoutons une variable d'environnement.
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
ENV PRENOM="Polytechnique"
Le nom de la variable est PRENOM et son contenu est Polytechnique.
Construisons notre image : docker build -t ubuntu_nodejs_ENV .
Maintenant, on va lancer un conteneur : docker run --rm -it ubuntu_nodejs_ENV
Nous sommes désormais dans le conteneur. Pour vérifier que notre variable est bien présente, utilisez la
commande printenv. : printenv PRENOM
Le résultat est le suivant : Polytechnique
Dockerfile - les Instructions
WORKDIR
Pour bien comprendre son fonctionnement, modifions le Dockerfile et ajoutons WORKDIR.
FROM celtak/ubuntu-ping-ip
RUN apt-get update
RUN apt-get install -y nodejs
WORKDIR /bin
Par conséquent, au lancement du conteneur, nous serons positionner dans le dossier /bin.
Pareillement les instructions RUN, ENTRYPOINT, COPY, ADD et CMD seront exécutées à partir de
répertoire sélectionné dans WORKDIR.
Dockerfile - les Instructions
EXPOSE
Le mot-clé EXPOSE permet d'indiquer dans quel port le conteneur écoute. Mais ce n'est
qu'une indication sous forme de documentation. Pour mapper réellement un ou plusieurs
ports, il faut utiliser l'option -p.
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get -y install apache2
EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
docker run --name myapache -d -p 80:80 apache:V1
Dockerfile - les Instructions
ARG
ARG nom=Test1
RUN echo $nom
Pour faire simple, ARG est une variable disponible dans le Dockerfile (elle ne le sera pas dans le
conteneur).
Elle est utilisée lors de la création de l'image. À ce moment plusieurs choses seront exécutés. La ligne
RUN echo $nom affichera le contenu de la variable nom grâce à l'instruction ARG nom=test1.
docker build -t ubuntu_nodejs_arg .
Nous pouvons changer le contenu de la variable lors de la création de l'image.
docker build --build-arg nom=test2 -t ubuntu_nodejs_arg .
La documentation de Docker nous encourage à ne pas à utiliser ARG pour y insérer des données
sensibles comme des mots de passes dans des variables. Car ces données seront récupérables avec
un docker history <image>.