đŸ’» TP : Conteneuriser (manuellement) un logiciel

L’objectif de ce TP est d’apprendre Ă  utiliser Podman pour transformer un conteneur en une image de conteneur, et pour publier une image au sein d’un registre de conteneur distant.

1. Préparatifs

1.1. CrĂ©ation d’un projet Gitlab

Les premiers Ă©noncĂ©s de ce TP nĂ©cessitent d’ĂȘtre rĂ©alisĂ©s au travers d’un projet sur le Gitlab de l’UniversitĂ©. Reprenez la notice Gitlab et suivez les instructions pour crĂ©er un nouveau projet privĂ© avec pour nom developpement_exploitation-tp-images.

Ce projet vous permettra de publier vos images de conteneurs au sein du registre de conteneur du Gitlab de l’universitĂ©.

Pour des raisons pratiques liĂ©es Ă  l’infrastructure disponible Ă  l’UniversitĂ©, on utilisera le serveur de dĂ©ploiement (podman) pour crĂ©er des images de conteneurs. Cependant, on notera qu’en pratique il est bien plus courant de crĂ©er une image directement depuis poste de travail utilisĂ© pour le dĂ©veloppement, ou bien Ă  l’aide d’un serveur d’intĂ©gration continue dĂ©diĂ© Ă  ce genre de tĂąches.

1.2. Authentification Podman pour le registre de conteneurs de l’UniversitĂ©

Ce TP va vous apprendre Ă  publier vos images sur le registre de conteneurs du Gitlab de l’UniversitĂ©. Cela nĂ©cessite au prĂ©alable de donner Ă  Podman vos informations de connexion pour qu’il puisse se connecter au Gitlab.

Pour cela, depuis le serveur de dĂ©ploiement, faites :

$ podman login docker-registry.univ-nantes.fr

Puis saisissez votre identifiant et votre mot de passe que vous utilisez pour vous connecter habituellement sur Gitlab, et validez.

Cette commande devra ĂȘtre re-exĂ©cutĂ©e au dĂ©but de chaque TP, car une fois effectuĂ©e l’authentification n’est valide que durant la session en cours !

2. Tutoriel : une premiĂšre image Ubuntu avec cowsay

2.1. Rappel du précédent tutoriel Ubuntu

Pour dĂ©buter, nous allons repartir du premier tutoriel du second TP. Pour rappel, nous avions créé un conteneur Ă  partir d’une image Ubuntu, puis nous avions exĂ©cutĂ© un interprĂ©teur de commandes dans ce conteneur afin d’installer un logiciel appelĂ© cowsay Ă  l’aide des commandes suivantes :

$ apt update
$ apt install cowsay

Un inconvĂ©nient de cette approche est que si l’on dĂ©truit le conteneur ainsi obtenu, alors on perdra au passage l’installation de logiciel rĂ©alisĂ©e. Ainsi, si on devait recrĂ©er un conteneur identique, il faudrait alors Ă  nouveau effectuer manuellement cette installation.

2.2. CrĂ©ation d’une image de conteneur cowsay

L’objectif ici est de crĂ©er une image de conteneur dans laquelle le logiciel souhaitĂ© (Ă  savoir cowsay) est dĂ©jĂ  installĂ©. Ainsi, tout conteneur créé Ă  partir de cette image possĂ©dera directement le logiciel souhaitĂ©.

Tout d’abord, prĂ©parons un nouveau conteneur Ă  partir d’une image de base, Ă  savoir l’image docker.io/ubuntu:24.04 (la mĂȘme que dans le premier tutoriel) :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run -ti --name cowsay_template \
                       docker.io/ubuntu:24.04
Nous avons nommĂ© notre conteneur cowsay_template pour bien signifier que notre conteneur est un template (c’est Ă  dire un gabarit ou un patron) qui sera ensuite transformĂ© en une nouvelle image de conteneur.

Au sein de ce nouveau conteneur, on installe la commande cowsay :

[sur le conteneur]
$ apt update
$ apt install cowsay

Enfin, on peut quitter le conteneur (ce qui l’arrĂȘte au passage) :

[sur le conteneur]
$ exit

Il ne nous reste plus qu’Ă  crĂ©er une nouvelle image de conteneur Ă  partir de notre conteneur template :

[sur l’environnement de dĂ©ploiement distant]
$ podman container commit cowsay_template \
                          tutoriel-cowsay:v1

Ici on a choisi de nommer notre nouvelle image de conteneur tutoriel-cowsay, et de lui donner l’Ă©tiquette v1.

Une fois l’image construite, vĂ©rifiez qu’elle est bien prĂ©sente dans votre stockage d’image local :

[sur l’environnement de dĂ©ploiement distant]
$ podman image list

On notera que la colonne REPOSITORY indique la rĂ©fĂ©rence d’image, qui dans notre cas commence par localhost puisque l’image est sur le stockage local.

Il est possible que vous ayez Ă©galement dans cette liste un reliquat d’images tĂ©lĂ©chargĂ©es dans les prĂ©cĂ©dents exercices, ce qui est normal.

Il ne nous reste plus qu’Ă  tester notre nouvelle image, on peut donc faire :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run --rm -ti \
                       localhost/tutoriel-cowsay:v1

On se retrouve dans un interprĂ©teur de commandes au sein du conteneur. On peut alors directement exĂ©cuter la commande souhaitĂ©e, sans avoir Ă  l’installer au prĂ©alable :

[sur le conteneur]
$ /usr/games/cowsay "Bonjour depuis notre premiĂšre image de conteneur !"

2.3. Publication de l’image

On souhaite publier notre image sur le registre de conteneurs associé au Gitlab de l' Université, dans le but (hypothétique) de pouvoir réutiliser cette image pour différents déploiements.

Dans un registre de conteneurs Gitlab, une image ne peut ĂȘtre stockĂ©e que au sein d’un projet dĂ©jĂ  créé. Nous allons ici utiliser le projet créé dans la Section 1.1 (TODO).

Pour publier votre image, prĂ©parez et exĂ©cutez la commande suivante :

[sur l’environnement de dĂ©ploiement distant]
$ podman image push localhost/tutoriel-cowsay:v1 \
                    docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v1

oĂč <chemin projet> est le chemin de votre projet au sein de l’arborescence Gitlab. Si vous avez le compte Ă©tudiant eXXXXX et que vous avez nommĂ© votre projet developpement_exploitation-tp-images, alors votre chemin de projet aura la forme eXXXXX/developpement_exploitation-tp-images.

Il est nĂ©cessaire de mettre votre compte Ă©tudiant en minuscules pour que le chemin cible de publication d’image fonctionne.
Dans cette commande, on observe que la derniĂšre partie de la cible de publication reprend le nom et l’Ă©tiquette de l’image (tutoriel-cowsay:v1) de maniĂšre identique au nom de l’image que nous avions créée dans le stockage local. En effet, le souhait ici est de garder le mĂȘme nom et la mĂȘme Ă©tiquette sur le registre distant. On notera cependant que ce n’est pas forcĂ©ment le cas : on peut trĂšs bien publier une image sous un nom et/ou une Ă©tiquette diffĂ©rente de son nom et son Ă©tiquette du stockage local.

Pour vĂ©rifier que la publication a bien fonctionnĂ©, utilisez un navigateur pour vous rendre sur la page du projet Gitlab, et rendez-vous dans la section DĂ©ploiement → Registre de conteneur. La liste doit contenir un Ă©lĂ©ment correspondant aux images nommĂ©es tutoriel-cowsay. En cliquant sur cet Ă©lĂ©ment, on accĂšde Ă  la liste des Ă©tiquettes, qui doit contenir simplement l’Ă©tiquette v1.

Pour tester votre image publiĂ©e, on peut de nouveau exĂ©cuter un conteneur mais avec une rĂ©fĂ©rence d’image correspondant Ă  l’image distante :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run --rm -ti \
                       docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v1

Et vous devriez avoir le mĂȘme rĂ©sultat que lors de l’exĂ©cution de l’image avec la rĂ©fĂ©rence locale.

2.4. Ajout d’un point d’entrĂ©e

On souhaite maintenant amĂ©liorer notre image en modifiant quel logiciel est exĂ©cutĂ© lors du dĂ©marrage d’un conteneur créé avec l’image. Cela nĂ©cessite de spĂ©cifier un point d’entrĂ©e pour l’image Ă  l’aide de la mĂ©tadonnĂ©e CMD.

Comme la v1 de notre image ne spĂ©cifiait pas de point d’entrĂ©e, elle hĂ©ritait par dĂ©faut de celui spĂ©cifiĂ© dans l’image de base (docker.io/ubuntu:24.04), ce qui correspond ici Ă  l’interprĂ©teur de commandes bash. C’est pour cela que la commande podman container run a directement dĂ©marrĂ© un interprĂ©teur de commande Ă  partir de notre image.

Pour ce tutoriel, on souhaite que la commande cowsay soit exĂ©cutĂ©e au dĂ©marrage d’un conteneur. ProblĂšme : cette commande nĂ©cessite un argument, Ă  savoir le message Ă  afficher. Comment faire pour qu’un conteneur créé Ă  partir de notre image puisse recevoir le message Ă  afficher ?

Comme on a pu le voir dans le TP prĂ©cĂ©dent, la technique la plus courante pour confier des informations Ă  un conteneur est sous la forme de variables d’environnement passĂ©es Ă  l’aide de l’option --env lors de la crĂ©ation du conteneur.

Si on revient Ă  la crĂ©ation de l’image, il est possible dans une mĂ©tadonnĂ©e CMD de faire rĂ©fĂ©rence Ă  une variable d’environnement avec la syntaxe $VARIABLE.

On va donc re-creér notre image de conteneur en ajoutant cette métadonnée :

[sur l’environnement de dĂ©ploiement distant]
$ podman container commit cowsay_template \
                          --change 'CMD /usr/games/cowsay $MESSAGE' \
                          tutoriel-cowsay:v2

On peut vĂ©rifier que l’image est bien créée Ă  nouveau Ă  l’aide de la commande :

$ podman image list
On peut voir que les deux images créées sont prĂ©sentes dans le stockage d’image local, la premiĂšre avec l’Ă©tiquette v1, la seconde avec l’Ă©tiquette v2.

On peut ainsi dĂ©sormais exĂ©cuter un conteneur de la sorte :

$ podman container run --rm \
                       --env MESSAGE="Re-bonjour depuis notre premiĂšre image !" \
                       localhost/tutoriel-cowsay:v2

Et voilà notre premiÚre image paramétrable lors de son exécution en conteneur !

2.5. Re-publication de l’image

Pour finir, on publie cette deuxiĂšme version de notre image aux cĂŽtĂ©s de la premiĂšre version :

$ podman image push localhost/tutoriel-cowsay:v2 \
                    docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v2

Allez de nouveau vĂ©rifier la liste des images au sein de la page de votre projet, et vous devez constater qu’il a dĂ©sormais deux Ă©tiquettes pour les images nommĂ©es tutoriel-cowsay.

3. Exercice : image Alpine avec Asciidoctor

3.1. ÉnoncĂ©

On souhaite prĂ©parer une image de conteneur qui permette d’exĂ©cuter facilement le logiciel Asciidoctor. Asciidoctor est un logiciel qui permet de convertir un fichier Ă©crit Ă  l’aide du langage Asciidoc (similaire au langage Markdown), afin de produire un document HTML en sortie.

Asciidoctor s’utilise depuis un terminal Ă  l’aide d’une commande qui peut prendre la forme suivante :

$ asciidoctor mondocument.adoc

et qui produit en résultat un fichier mondocument.html

Pour notre image de conteneur, on fait les choix suivants :

  • On utilisera comme image de base l’image officielle Alpine disponible sur le Docker Hub, en version 3.22.

  • On installera Asciidoctor simplement Ă  l’aide de l’utilitaire apk disponible sur Alpine Linux. Avec apk, Asciidoctor peut ĂȘtre installĂ© Ă  l’aide du paquet appelĂ© asciidoctor. Comme dĂ©jĂ  prĂ©sentĂ© dans le TP prĂ©cĂ©dent, apk s’utilise principalement avec deux actions :

    • apk update permet de rĂ©cupĂ©rer la liste des paquets disponibles (similaire Ă  apt update),

    • apk add <nom du paquet> permet d’installer un nouveau paquet (similaire Ă  apt install).

En outre, on souhaite que le point d’entrĂ©e de notre image soit l’exĂ©cution de la commande asciidoctor sur un fichier situĂ© dans un rĂ©pertoire /data situĂ© dans le conteneur.

L’image de conteneur produite devra avoir pour nom exercice-asciidoctor et pour Ă©tiquette 1.0.

3.2. Questions

  1. Faites un travail préliminaire de conception de votre future image de conteneur en vous posant notamment les questions suivantes :

    • est-il nĂ©cessaire de pouvoir configurer l’exĂ©cution du logiciel conteneurisĂ© (Ă  savoir Asciidoctor) ? si oui, quel mode de configuration est possible et pourrait ĂȘtre mis en place ?

    • quel point d’entrĂ©e dĂ©finir pour l’image ? comment articuler ce point d’entrĂ©e avec le mode de configuration choisi au point prĂ©cĂ©dent ?

    • est-ce qu’un montage sera nĂ©cessaire lors de la phase d’usage de l’image ? lequel et pourquoi ? comment rendre cohĂ©rent ce point de montage avec le mode de configuration et avec le point d’entrĂ©e dĂ©finis prĂ©cĂ©demment ?

      Pour vous aider, vous pouvez également vous poser les questions suivantes :

      • Comment permettre Ă  Asciidoctor de lire le fichier que l’on souhaite convertir en HTML ?

      • Comment permettre Ă  Asciidoctor de savoir quel fichier convertir ?

  2. PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©. Pour cela, vous pouvez d’abord vous poser les questions suivantes :

    1. Quelle est la rĂ©fĂ©rence de l’image de base Ă  utiliser ?

    2. Quelles commandes faut-il exĂ©cuter au sein du conteneur pour installer Asciidoctor ?

  3. En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur.

  4. VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.

  5. Testez votre nouvelle image de conteneur en exĂ©cutant un conteneur qui convertit un fichier Asciidoc de l’environnement d’accueil en HTML.

  6. Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.

4. Tutoriel : une image pour dĂ©ployer un site web avec nginx

4.1. Rappel du précédent tutoriel nginx

Pour dĂ©buter, nous allons repartir du premier tutoriel du TP sur la publication de port. Pour rappel, dans ce tutoriel, nous avions créé un conteneur Ă  partir d’une image nginx Ă  l’aide de la rĂ©fĂ©rence d’image docker.io/nginx:1.25, et nous avons exĂ©cutĂ© ce conteneur avec Ă  la fois un montage de rĂ©pertoire pour lui confier des fichiers HTMLs, et avec une publication de port pour que le serveur web soit accessible par le rĂ©seau.

Cette approche est tout a fait viable pour déployer un site web. Cependant, si dans le futur il devient nécessaire de migrer notre site web depuis un premier serveur de déploiement vers un nouveau serveur de déploiement, elle a pour inconvénient de nécessiter le déplacement de tous les fichiers du site web vers le nouveau serveur.

4.2. CrĂ©ation d’une image de conteneur nginx avec site web intĂ©grĂ©

L’objectif ici est de crĂ©er une image de conteneur dans laquelle se trouve directement Ă  la fois le logiciel nginx et le site web qu’on souhaite dĂ©ployer. Ainsi, la migration de ce site web ne nĂ©cessitera plus qu’Ă  supprimer le conteneur d’un premier serveur de dĂ©ploiement, et de recrĂ©er un conteneur identique sur un nouveau serveur.

Pour accomplir cela, il nous faut, lors de la crĂ©ation de l’image, s’assurer que notre site web (qui contient Ă  minima un fichier index.html) soit copiĂ© dans le rĂ©pertoire /usr/share/nginx/html/ de l’image, car c’est Ă  cet emplacement que nginx va charger le site qu’il rendra accessible.

Au sein de l’image nginx, le contenu par dĂ©faut de /usr/share/nginx/html/ n’est pas vide, car il contient une page d’accueil d’exemple, qui ne nous intĂ©resse pas ! Il va donc nous falloir remplacer ce rĂ©pertoire par le contenu de notre choix.

On commence par crĂ©er un conteneur template Ă  partir d’une image de base. Cette fois-ci, on choisit comme base l’image officielle nginx, qui permet de partir d’une base dans laquelle le logiciel nginx est dĂ©jĂ  installĂ© :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run -ti --name nginx_template \
                       docker.io/nginx:1.25 \
                       bash
On spĂ©cifie que l’on souhaite utiliser l’interprĂ©teur de commandes bash comme point d’entrĂ©e, car par dĂ©fait le point d’entrĂ©e de l’image officielle nginx est le dĂ©marrage du serveur web.

Dans notre conteneur template, il nous faut d’abord supprimer la page web exemple qui y est fournie par dĂ©faut dans l’image de conteneur nginx :

[sur le conteneur]
# rm /usr/share/nginx/html/*

On va ensuite y mettre Ă  la place notre propre page web. Pour cet exercice, utilisez le fichier HTML que vous aviez gĂ©nĂ©rĂ© Ă  l’aide d’Asciidoctor dans l’exercice prĂ©cĂ©dent, et Ă  l’aide d’un second terminal, copiez ce fichier au sein de votre conteneur template :

[sur l’environnement de dĂ©ploiement distant]
$ podman container cp <fichier html> nginx_template:/usr/share/nginx/html/index.html
Lors de cette copie, on renomme notre fichier HTML en index.html, car c’est le fichier qui sera utilisĂ© par dĂ©faut par nginx comme point de dĂ©part de notre site web.

Dans le conteneur, on peut vérifier que notre fichier est bien arrivé à destination :

[sur le conteneur]
# cd /usr/share/nginx/html/
# ls

Si tout est bon, on peut quitter le conteneur (ce qui le stoppe au passage) :

[sur le conteneur]
# exit

Il ne nous reste plus qu’Ă  transfomer notre conteneur template en nouvelle image de conteneur. Il nous faut pour cela spĂ©cifier un point d’entrĂ©e. On choisit ici de rĂ©utiliser Ă  l’identique le mĂȘme point d’entrĂ©e que l’image de conteneur officielle nginx, qui consiste juste Ă  dĂ©marrer le serveur web :

[sur l’environnement de dĂ©ploiement distant]
$ podman container commit  nginx_template \
                           --change 'CMD nginx -g "daemon off;"' \
                           tutoriel-nginx:1

Enfin, testez votre image en crĂ©ant un conteneur :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run --rm \
                       --detach \
                       --name nouveau_serveur_web \
                       --publish <mon port réseau>:80 \
                       localhost/tutoriel-nginx:1
Cette fois-ci, pas besoin de montage de rĂ©pertoire pour dĂ©ployer notre site web : ce dernier est dĂ©jĂ  inclus dans l’image, et donc dans le conteneur !

VĂ©rifiez que votre dĂ©ploiement fonctionne en accĂ©dant depuis un navigateur Ă  l’adresse http://podman:<mon port rĂ©seau> : normalement votre HTML s’affiche comme prĂ©vu !

4.3. Publication de l’image

Enfin, publiez votre image Ă  l’aide de la commande :

$ podman image push localhost/tutoriel-nginx:1 \
                    docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-nginx:1

en remplaçant Ă  nouveau <chemin projet> par l’emplacement de votre projet sur Gitlab.

5. Exercice : une image de conteneur pour economic_dispatch

5.1. ÉnoncĂ©

On souhaite prĂ©parer une image de conteneur qui permette d’exĂ©cuter facilement le l’outil economic_dispatch vu dans les premiers TPs. Pour rappel, c’est un outil Ă©crit en Julia qui permet de faire un calcul d’optimisation Ă  partir d’un modĂšle de scĂ©nario.

Pour notre image de conteneur, on fait les choix suivants :

  • On utilisera comme image de base docker.io/julia, avec l’Ă©tiquette 1.11-trixie.

  • Lors de la phase d’usage de l’image, on souhaite pouvoir confier un modĂšle d’entrĂ©e Ă  notre outil.

  • L’image de conteneur produite devra avoir pour nom exercice-economic-dispatch et pour Ă©tiquette a.

Pour rappel, il est possible d’installer une bibliothùque Julia avec la commande suivante:

# julia -e 'import Pkg; Pkg.add("<nom de la bibliothĂšque>")'

5.2. Questions

  1. Faites un travail préliminaire de conception de votre future image de conteneur.

    RĂ©flĂ©chissez bien au point d’entrĂ©e que vous souhaitez avoir.
  2. PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©.

    Pour récupérer le code source du projet Gitlab, vous pouvez suivre les instructions dédiées de la notice Gitlab.
  3. En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur.

  4. VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.

  5. Testez votre nouvelle image de conteneur en exĂ©cutant un conteneur qui s’exĂ©cute sur le modĂšle exemple fourni dans la documentation de l’outil.

  6. Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.

6. Exercice : crĂ©er une image pour Web Calculator (Python)

6.1. ÉnoncĂ©

On souhaite crĂ©er une image de conteneur pour un logiciel fraĂźchement dĂ©veloppĂ© appelĂ© Web Calculator. C’est une application web dĂ©veloppĂ©e en Python, dont le code source est disponible sur le projet Gitlab suivant.

Une fois exĂ©cutĂ©e, l’application peut ĂȘtre accĂ©dĂ©e via un navigateur web, et fournit une interface pour faire des calculs arithmĂ©tiques entre deux nombres (addition, soustraction, etc.).

Lisez la documentation de l’application, et en particulier les sections 3 et 4. On y trouve des informations importantes, notamment :

  • Le logiciel nĂ©cessite un certain nombre de dĂ©pendances Python.

  • Ces dĂ©pendances peuvent ĂȘtre installĂ©es Ă  l’aide de l’utilitaire pip.

  • Une commande uvicorn permet de dĂ©marrer le logiciel.

  • Le logiciel nĂ©cessite le port rĂ©seau 8000 pour recevoir des connexions.

La documentation fait rĂ©fĂ©rence Ă  un concept Python appelĂ© venv. C’est une maniĂšre pratique pour crĂ©er des environnements Python dans lesquelles on installer des dĂ©pendances spĂ©cifiques Ă  un dĂ©veloppement ou un dĂ©ploiement particulier. Dans notre cas, nous pouvons ignorer l’utilisation de venv car cela n’est pas nĂ©cessaire dans un conteneur, qui fourni dĂ©jĂ  un environnement isolĂ© adaptĂ©.

6.2. Questions

  1. Faites un travail préliminaire de conception de votre future image de conteneur.

    À nouveau, rĂ©flĂ©chissez bien au point d’entrĂ©e que vous souhaitez avoir.
  2. PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©.

    Pour récupérer le code source du projet Gitlab, vous pouvez suivre les instructions dédiées de la notice Gitlab.
  3. En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur, avec pour nom webcalculator et pour étiquette dev.

  4. VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.

  5. Testez votre application Ă  l’aide d’un navigateur.

  6. Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.