đŸ’» TP : Montage de rĂ©pertoires/fichiers

1. Présentation et objectifs

L’objectif de ce TP est d’apprendre Ă  utiliser le montage de rĂ©pertoire/fichier avec Podman pour plus facilement gĂ©rer les donnĂ©es de logiciels exĂ©cutĂ©s dans des conteneurs.

Comme pour le TP prĂ©cĂ©dent, lorsque le sujet de TP vous propose d’exĂ©cuter une commande, il est demandĂ© que vous arriviez Ă  comprendre tout ce que comporte cette commande. Prenez le temps de bien lire et dĂ©cortiquer chaque commande qui vous est proposĂ©e, et n’hĂ©sitez pas Ă  poser des questions.

2. Connexion au serveur de déploiement

Comme pour le TP prĂ©cĂ©dent, toute la suite du TP devra ĂȘtre effectuĂ©e sur l’environnement de dĂ©ploiement. Vous pouvez donc commencer par ouvrir un terminal et ouvrir une session SSH Ă  distance sur ce dernier, comme vous avez appris Ă  le faire dans le đŸ’» TP : DĂ©couverte de l’infrastructure et des outils.

Pour rappel, il est tout Ă  fait possible d’ouvrir plusieurs terminaux en parallĂšle. Vous pouvez ainsi, si nĂ©cessaire ouvrir plusieurs connexions vers le serveur de dĂ©ploiement. Cela peut ĂȘtre utile par exemple pour lancer un conteneur dans un premier terminal (avec run), et l’observer (avec ps ou logs) ou le manipuler (avec stop ou rm) depuis un second. Vous pouvez Ă©galement garder un autre terminal ouvert pour exĂ©cuter des commandes sur votre poste Linux.

3. Tutoriel : premiers montages dans un conteneur Ubuntu

3.1. Un premier montage de répertoire

Nous allons commencer ce TP de maniĂšre similaire au TP prĂ©cĂ©dent, en crĂ©ant un conteneur Ă  partir d’une image Ubuntu. Cependant, cette fois-ci nous allons mettre en place un montage de rĂ©pertoire permettant d’Ă©changer facilement des donnĂ©es avec le conteneur.

Commençons par prĂ©parer un nouveau rĂ©pertoire dans votre rĂ©pertoire utilisateur au sein de l’environnement de dĂ©ploiement, et ajoutons un fichier appelĂ© mon_fichier dans ce rĂ©pertoire :

[sur l’environnement de dĂ©ploiement distant]
$ mkdir ~/tp-montage/tutoriel_1
$ echo "Ce fichier a été créé en dehors du conteneur" > ~/tp-montage/tutoriel_1/mon_fichier

Ensuite on crée le conteneur de maniÚre similaire à la derniÚre fois, mais en ajoutant cette fois-ci le montage :

[sur l’environnement de dĂ©ploiement distant]
$ cd ~
$ podman container run --name conteneur_avec_montage \
                    --tty \
                    --interactive \
                    --mount type=bind,source="./tp-montage/tutoriel_1",target="/repertoire_montage" \
                    docker.io/ubuntu:24.04

L’option --mount ici dĂ©clare trois choses :

  • type=bind dĂ©clare le type de montage, Ă  savoir un montage de rĂ©pertoire/fichier (le seul type de montage Ă©tudiĂ© dans ce cours),

  • source="./tp-montage/tutoriel_1" dĂ©clare que nous souhaitons monter le rĂ©pertoire ./tp-montage/tutoriel_1 de l’environnement de dĂ©ploiement,

  • target="/repertoire_montage" dĂ©clare que le point de montage au sein du conteneur sera le rĂ©pertoire /repertoire_montage.

Faites trĂšs attention lors de vos montages de rĂ©pertoire : pensez comme montrĂ© ici Ă  toujours prĂ©parer un nouveau rĂ©pertoire pour chacun de vos conteneurs !

Cela vous Ă©vite d’une part de mĂ©langer les donnĂ©es de vos diffĂ©rents dĂ©ploiements, et vous Ă©vite d’autre part de partager par erreur un rĂ©pertoire critique avec votre conteneur, ou bien entre diffĂ©rents conteneurs.

Par exemple, il ne faut surtout pas monter l’intĂ©gralitĂ© de votre rĂ©pertoire utilisateur au sein de votre conteneur (en faisant par exemple --mount type=bind,source="/comptes/EXXXXXX",target="/chemin/dans/mon/conteneur"), car le logiciel s’exĂ©cutant dans le conteneur pourrait faire n’importe quoi Ă  vos fichiers − par exemple en modifiant les droits d’accĂšs de tous vos fichiers !

Une fois le conteneur créé et démarré, on obtient comme la fois précédente un interpréteur de commande interactif. On peut alors regarder les répertoires disponibles à la racine du systÚme de fichiers :

[sur le conteneur]
# ls /

Parmi la liste des rĂ©pertoires on voit apparaĂźtre repertoire_montage, le point de montage choisi dans l’option --mount !

On peut se rendre dans ce répertoire et constater que notre fichier est bien présent, avec le bon contenu :

[sur le conteneur]
# cd /repertoire_montage
# ls
# cat ./mon_fichier

3.2. Deux rĂ©pertoires trĂšs trĂšs liĂ©s ⛓

VĂ©rifions maintenant que le rĂ©pertoire /repertoire_montage du conteneur est bien liĂ© au rĂ©pertoire ~/tp-montage/tutoriel_1 de l’environnement de dĂ©ploiement. Pour cela nous allons faire deux modifications dans ce rĂ©pertoire depuis le conteneur :

  1. Éditez le fichier ~/tp-montage/tutoriel_1/mon_fichier pour y ajouter le texte de votre choix :

    [sur le conteneur]
    # nano ./mon_fichier
    La commande nano n’est pas installĂ©e par dĂ©faut dans un environnement Ubuntu : vous devez d’abord l’installer ! Le paquet apt correspondant s’appelle simplement nano.
  2. Puis créez un nouveau fichier à cÎté de ce premier fichier :

    [sur le conteneur]
    # echo "Ceci est un second fichier" > ./mon_second_fichier

Observons maintenant les consĂ©quences de ces changements. À l’aide d’un second terminal, rendez-vous dans le rĂ©pertoire montĂ© de l’environnement de dĂ©ploiement, et vĂ©rifiez son contenu ainsi que celui des deux fichiers :

[sur l’environnement de dĂ©ploiement distant]
$ cd ~/tp-montage/tutoriel_1
$ ls
$ cat ./mon_fichier
$ cat ./mon_second_fichier

Tous les changements effectuĂ©s dans le conteneur sont bien apparents dans l’environnement de dĂ©ploiement !

On pourrait Ă  nouveau modifier le contenu du rĂ©pertoire ~/tp-montage/tutoriel_1 depuis l’environnement de dĂ©ploiement, constater que les changements apparaissent dans le rĂ©pertoire /repertoire_montage du conteneur, et ainsi de suite


En rĂ©sumĂ© : on observe bien de chaque cĂŽtĂ© le mĂȘme rĂ©pertoire accessible depuis les deux environnements.

3.3. Un montage de fichier

Il est Ă©galement possible de faire un montage de fichier dans le conteneur. CrĂ©ons un fichier Ă  monter dans l’environnement de dĂ©ploiement :

[sur l’environnement de dĂ©ploiement distant]
$ echo "Ce fichier va ĂȘtre montĂ© dans un conteneur" > ~/tp-montage/tutoriel_1/mon_troisiĂšme_fichier

Puis créons un second conteneur en déclarant un montage avec ce nouveau fichier :

[sur l’environnement de dĂ©ploiement distant]
$ cd ~
$ podman container run --name conteneur_avec_montage_2 \
                    --tty \
                    --interactive \
                    --mount type=bind,source="./tp-montage/tutoriel_1/mon_troisiĂšme_fichier",target="/root/fichier_dans_conteneur" \
                    docker.io/ubuntu:24.04

Une fois dans le conteneur, on peut vĂ©rifier que le fichier montĂ© est bien prĂ©sent Ă  l’emplacement du point de montage, avec le bon contenu :

[sur le conteneur]
# cd /root
# ls
# cat ./fichier_dans_conteneur

Et normalement tout est bon !

Pour aller plus loin, on peut modifier ce fichier depuis le conteneur (par exemple Ă  l’aide de nano), et constater que ce changement est bien visible au sein du fichier ~/tp-montage/tutoriel_1/mon_troisiĂšme_fichier de l’environnement de dĂ©ploiement.

4. Ménage

Avant de passer aux exercices suivant, pensez à supprimer les conteneurs que vous avez créé dans ce tutoriel !

5. Exercice : faciliter l’usage du conteneur Asciidoc avec un montage

5.1. ÉnoncĂ©

Dans cet exercice on se propose de reprendre l’exercice Asciidoc du TP prĂ©cĂ©dent, mais cette fois-ci sans exĂ©cuter la commande podman container cp : on souhaite cette fois-ci reposer sur un montage de rĂ©pertoire afin de passer des fichiers au conteneur, et afin de rĂ©cupĂ©rer les fichiers gĂ©nĂ©rĂ©s au sein du conteneur.

Commencez par relire l’Ă©noncĂ© (qui reste le mĂȘme pour cet exercice) avant de passer aux questions qui suivent.

5.2. Questions

  1. Sur l’environnement de dĂ©ploiement, prĂ©parez un rĂ©pertoire vide que vous monterez dans le conteneur que vous allez crĂ©er.

  2. PrĂ©parez et exĂ©cutez une commande pour crĂ©er un conteneur Alpine avec l’image de conteneur accessible par l’Ă©tiquette 3.22, et avec les options nĂ©cessaires pour :

    • lui donner le nom alpine_asciidoctor,

    • permettre les interactions clavier avec le conteneur,

    • dĂ©finir un montage de rĂ©pertoire depuis le rĂ©pertoire créé dans la question 1, vers un rĂ©pertoire de votre choix au sein du conteneur.

  3. Une fois dans le conteneur, exĂ©cutez les commandes nĂ©cessaires pour installer asciidoctor. VĂ©rifiez que l’outil est bien installĂ© en l’exĂ©cutant avec l’option --version.

  4. Sur votre poste de travail, préparez un fichier financiers.adoc contenant la recette de financiers montrée en exemple plus haut.

  5. À l’aide d’un second terminal, dĂ©placez le fichier financiers.adoc au sein du rĂ©pertoire que vous avez prĂ©parĂ© sur l’environnement de dĂ©ploiement.

  6. Dans votre conteneur, vérifiez que le fichier financiers.adoc est bien apparu dans votre point de montage, puis exécutez asciidoctor de maniÚre à convertir le fichier en HTML. Utilisez ls pour vérifier que vous avez bien produit un fichier financiers.html.

  7. À l’aide d’un second terminal, vĂ©rifiez sur l’environnement de dĂ©ploiement que le fichier HTML produit est bien accessible dans le rĂ©pertoire qui a Ă©tĂ© montĂ© dans le conteneur.

  8. Quittez le conteneur, puis supprimez le.

  9. Cette fois-ci, qu’est devenu le fichier financiers.adoc que vous avez manipulĂ© au sein du conteneur ?

6. Exercice : faciliter le dĂ©ploiement de economic_dispatch

6.1. ÉnoncĂ©

Dans cet exercice on se propose de reprendre l’exercice economic_dispatch du TP prĂ©cĂ©dent, mais lĂ  aussi sans exĂ©cuter la commande podman container cp : on souhaite cette fois-ci reposer sur un montage de rĂ©pertoire afin de passer le programme ainsi que le fichier de test dans le conteneur.

Relisez bien l’Ă©noncĂ© de l’exercice du TP prĂ©cĂ©dent, et pour la suite n’hĂ©sitez pas Ă  partir de la commande que vous aviez dĂ©jĂ  prĂ©parĂ© lorsque vous aviez fait cet exercice.

6.2. Questions

  1. Sur l’environnement de dĂ©ploiement, prĂ©parez un nouveau rĂ©pertoire que vous monterez au sein de votre conteneur.

  2. Dans ce rĂ©pertoire, ajoutez le fichier economic_dispatch.jl, ainsi qu’un fichier de test permettant de tester l’outil (se rĂ©fĂ©rer au README).

  3. Préparez un conteneur, avec un nom, avec les options permettant les interactions clavier, la dépendance requise par economic_dispatch, et avec un montage du répertoire préparé à la question précédente.

    Comme dans le TP prĂ©cĂ©dent, n’hĂ©sitez pas Ă  dĂ©marrer votre conteneur avec un point d’entrĂ©e plus adaptĂ© Ă  vos besoins, par exemple bash.
  4. Dans votre conteneur, vĂ©rifiez que votre dĂ©pendance est bien installĂ©e (pensez Ă  utiliser l’option --version).

  5. ExĂ©cutez l’outil Ă  l’aide du fichier test, et observez que vous obtenez les mĂȘmes rĂ©sultats que ceux montrĂ©s dans le README.

  6. S’il n’y a pas d’erreur, c’est bon ! Quittez le conteneur puis supprimez-le lorsque vous avez terminĂ©.

7. Exercice : dĂ©ployer le logiciel docker-ffmpeg-converter

Jusqu’ici nous n’avons effectuĂ© que des dĂ©ploiements de logiciels "jouets" permettant de manipuler les notions du cours en douceur. Dans ce dernier exercice, l’objectif est de dĂ©ployer un "vrai" logiciel existant, qui n’a pas Ă©tĂ© prĂ©parĂ© juste pour les objectifs de ce cours.

7.1. ÉnoncĂ©

Nous souhaitons dĂ©ployer le logiciel docker-ffmpeg-converter. Ce logiciel se charge de convertir automatiquement des vidĂ©os dans un format souhaitĂ© Ă  l’aide de l’outil linux ffmpeg, en lisant automatiquement et continuellement les vidĂ©os d’un rĂ©pertoire dit "source", et en produisant automatiquement les vidĂ©os converties dans un autre rĂ©pertoire dit "destination".

docker-ffmpeg-converter est similaire au cas d’Ă©tude Automatic-Image-Converter Ă©tudiĂ© en cours, mais convertit des vidĂ©os et non pas des images.

Une image de conteneur a dĂ©jĂ  Ă©tĂ© mise au point pour facilement dĂ©ployer docker-ffmpeg-converter. En lisant la documentation de l’image, on dĂ©couvre qu’elle possĂšde les caractĂ©ristiques suivantes :

  • Le point d’entrĂ©e de l’image est l’exĂ©cution du logiciel docker-ffmpeg-converter.

    Comme le point d’entrĂ©e n’est pas un interprĂ©teur de commandes, il n’est pas pertinent de rendre interactif (via les options --tty et --interactive) un conteneur créé Ă  partir de cette image. En effet, le processus de docker-ffmpeg-converter n’attend aucune entrĂ©e clavier pour pouvoir fonctionner.
  • Lorsqu’il est exĂ©cutĂ© au sein de cette image, docker-ffmpeg-converter est conçu pour comprendre notamment les variables d’environnement suivantes :

    • SOURCE_DIRECTORY_PATH : le rĂ©pertoire surveillĂ© par le logiciel, oĂč les utilisateur⋅ices doivent dĂ©poser les fichiers vidĂ©os qu’iels souhaitent convertir.

    • DESTINATION_DIRECTORY_PATH : le rĂ©pertoire oĂč le logiciel va Ă©crire les vidĂ©os une fois converties, et oĂč les utilisateur⋅ices pourront rĂ©cupĂ©rer le rĂ©sultat.

    • GLOB_PATTERNS : liste de motifs glob qui dĂ©finissent quels fichiers du rĂ©pertoire surveillĂ© sont pris en considĂ©ration par le logiciel. Par exemple le motif glob *.avi fera que seuls les fichiers se terminant par l’extension .avi seront convertis.

    • SCAN_INTERVAL : le nombre de secondes que va attendre docker-ffmpeg-converter avant de surveiller Ă  nouveau le rĂ©pertoire surveillĂ©.

    • FFMPEG_ARGS : arguments confiĂ©s Ă  l’outil ffmpeg lorsqu’il est appelĂ© par docker-ffmpeg-converter pour convertir chaque fichier vidĂ©o dĂ©couvert. Ces arguments doivent ĂȘtre conformes aux options permises et reconnues par ffmpeg. Si la valeur %s est utilisĂ©e dans un argument, docker-ffmpeg-converter la remplacera automatiquement par le nom du fichier d’entrĂ©e.

      ffmpeg est un outil trĂšs complexe de traitement vidĂ©o ; il ne vous est pas demandĂ© de comprendre comment il fonctionne ou quelles options peuvent lui ĂȘtre confiĂ©es.
    • LOG_FORMAT : le format d’affichage des messages de logging affichĂ© par le logiciel au cours de son exĂ©cution. Peut prendre la valeur json pour un affichage en JSON, ou text pour un affichage en texte simple.

  • L’image de conteneur de docker-ffmpeg-converter est disponible sur le registre ghcr.io (qui est celui de Github) sous le nom kennethwussmann/docker-ffmpeg-converter.

  • Une Ă©tiquette valide pour cette image est 1.2.0.

On souhaite rĂ©aliser un dĂ©ploiement de docker-ffmpeg-converter sur l’environnement de dĂ©ploiement de TP avec les contraintes suivantes :

  • Le logiciel doit convertir tous les fichiers avec l’extension .webm dĂ©posĂ©s dans le rĂ©pertoire ~/tp-montage/docker-ffmpeg-converter/inputs de l’environnement de dĂ©ploiement,

  • Le logiciel doit dĂ©poser les fichiers convertis dans le rĂ©pertoire ~/tp-montage/docker-ffmpeg-converter/outputs de l’environnement de dĂ©ploiement,

  • On souhaite couvertir les fichiers d’entrĂ©e dans le format MP4, en fixant le nombre d’images par seconde Ă  24, et en produisant un fichier avec le suffixe .mp4, et avec des message de logging rĂ©duits ; pour accomplir cela on souhaite passer les arguments suivants Ă  ffmpeg :

    -loglevel error -y -fflags +genpts -i %s -r 24 %s.mp4
    Comme dĂ©jĂ  expliquĂ©, vous n’avez pas besoin de comprendre en dĂ©tail les arguments passĂ©s Ă  ffmpeg.
  • On souhaite que le logiciel vĂ©rifie la prĂ©sence de nouveaux fichiers toutes les 5 secondes.

  • On souhaite que les messages de logging soient affichĂ©s en texte simple

7.2. Questions

  1. À l’aide d’une crĂ©ation de conteneur, effectuez le dĂ©ploiement demandĂ© dans l’Ă©noncĂ©.

    Vous allez avoir besoin de confier des variables d’environnement Ă  votre conteneur, afin de configurer le logiciel dĂ©ployĂ©. N’hĂ©sitez pas Ă  vous rĂ©fĂ©rer au le chapitre sur l’exĂ©cution des logiciels pour revoir cette notion, et au le chapitre dĂ©diĂ© Ă  la crĂ©ation de conteneurs pour revoir comment transmettre une variable d’environnement Ă  un conteneur donnĂ©.
  2. Constatez que le processus exĂ©cutĂ© dans le conteneur affiche des messages de logging dans le terminal oĂč vous avez créé le conteneur. Ces messages nous informent sur les actions rĂ©alisĂ©es par le logiciel.

  3. Vérifiez que votre déploiement est conforme aux attentes :

    1. Sur votre poste de travail, tĂ©lĂ©chargez la vidĂ©o WebM accessible via ce lien (une fois face Ă  la vidĂ©o, utilisez le raccourci clavier Ctrl+S de votre navigateur pour l’enregistrer).

    2. TransfĂ©rez cette vidĂ©o sur l’environnement de dĂ©ploiement distant, puis copiez cette vidĂ©o dans le rĂ©pertoire ~/tp-montage/docker-ffmpeg-converter/inputs

    3. Constatez dans les messages de log du logiciel que le fichier a été découvert et a été traité.

    4. Constatez dans le rĂ©pertoire ~/tp-montage/docker-ffmpeg-converter/inputs de l’environnement de dĂ©ploiement qu’une conversion en MP4 du fichier d’entrĂ©e est bien apparente.

    5. TransfĂ©rez le rĂ©sultat de la conversion sur votre poste de travail, et ouvrez le pour vĂ©rifier que la vidĂ©o convertie est bien la mĂȘme que la vidĂ©o d’origine.