1. Gestion des dépendances

Python utilise un gestionnaire de dépendances appelé pip. Il récupère les dépendances depuis le Python Package Index, un dépôt centralisé de paquets Python.

Exemple d’usage :

python -m pip install SomePackage            # latest version
python -m pip install SomePackage==1.0.4     # specific version
python -m pip install 'SomePackage>=1.0.4'   # minimum version

Au sein d’un projet, on ne peut pas demander à chaque membre de l’équipe d’installer les dépendances une à une. Ce serait une perte de temps et une source d’erreur (typo dans le nom du package ou numéro de version inexacte).

Généralement, on utilise un fichier requirements.txt pour lister les dépendances du projet avec leurs versions. Or il y a des fonctionnalités que l’on retrouve dans d’autres gestionnaires qui ne sont pas disponibles dans pip, ou d’une manière détournée :

  • Avec certains gestionnaires, on trouve un fichier .lock qui spécifie les versions exactes des dépendances.
    Lorsque l’on souhaite installer toutes les dépendances, seules les versions exactes indiquées dans ce fichier sont installées, même si la version possède des mises à jour disponibles.
    Cela évite d’avoir des différentiels de versions entre les membres de l’équipe et sur les environnements de déploiement.
  • Certaines dépendances ne doivent être installées que sur des environnements spécifiques (ce qui est relatif aux tests unitaires ne doit pas être installé sur l’environnement de production), ce que pip permet en partie de faire.

Nous allons utiliser un outil plus “sexy” et adapté : Poetry.

1.1. Installation de Poetry

  1. Créez la branche local-python-poetry.
  2. Remplacez le contenu du Dockerfile par le nouveau fourni : dockerfile-python-02.
    On y a rajouté l’installation de Poetry et l’ajout de variables d’environnement pour surcharger quelques configurations pour python et d’autres composants.
  3. Faites un nouveau build de l’image.
  4. Exécutez un shell bash dans un container à partir de l’image pour poursuivre la configuration de Poetry.
    N’oubliez pas les bonnes options à votre commande docker…
  5. Exécutez la commande poetry about pour vérifier que la librairie est bien installée.
  6. Grâce aux commandes poetry init et poetry lock, générez les fichiers suivants :
    • pyproject.toml : Intègre les informations globales de votre “projet python” et permet de lister les dépendances.
    • poetry.lock : Indique les versions exactes des dépendances installées. C’est à partir de ce fichier que tout un chacun pourra installer les bonnes dépendances python.
  7. Ces fichiers ne sont disponibles que dans ce container. Faites en sorte de récupérer ces fichiers ou leur contenu en local dans le dossier docker/python.

Vous devriez alors avoir trois fichiers dans le dossier docker/python de votre repository : Dockerfile, poetry.lock et pyproject.toml.

1.2. Configuration de Poetry dans le Dockerfile

Afin de pouvoir utiliser la puissance du cache des images Docker, on va faire en sorte que les dépendances soient installées directement à la construction de l’image.

Rajoutez les instructions suivantes après les instructions sur l’utilisateur cli :

# Dependencies
COPY --chown=cli:cli ./docker/python/pyproject.toml ./docker/python/poetry.lock ./

RUN poetry install

La première instruction va faire une copie des deux nouveaux fichiers directement à la racine du workdir de l’image. Ils pourront alors être utilisés très facilement par Poetry. On spécifie aussi l’utilisateur propriétaire de ces fichiers. Dans le cas contraire, le propriétaire aurait été root et ça aurait été très bloquant pour la suite.

Cette commande COPY vérifie aussi s’il y a un différentiel entre les fichiers sources et les fichiers cachés dans la construction de l’image. S’il y a une différence, la prochaine construction de l’image n’utilisera pas le cache à partir de cette instruction, permettant alors de prendre en compte les modifications de ces fichiers.

Enfin, la deuxième instruction permet d’installer dans l’image les dépendances définies par les deux fichiers.

Une fois ce code rajouté à votre Dockerfile, construisez de nouveau l’image.

1.3. Utilisation de Poetry

Poetry va donc être utilisée pour définir les dépendances de notre utilitaire python à travers les commandes poetry add <package> ou poetry remove <package>.

Pour que python puisse exécuter des scripts en utilisant les librairies installées, il sera nécessaire de passer également par le biais de Poetry avec la commande poetry run python. Ainsi, pour exécuter un script hello_world.python, on utilisera la commande poetry run python hello_world.python au lieu de python hello_world.python.

Nous allons procéder à quelques modifications au sein de nos scripts bash.

  1. Créez le script bash bin/env/poetry en vous basant sur le script bash bin/python.
    • Ce script va vérifier également que l’image existe, sinon il fera appel au script de setup.
    • Ce script va également construire un container à partir de l’image et va exécuter la commande poetry.
    • Assurez-vous de bien prendre en compte les paramètres fournis à votre script.
  2. Testez le script : bin/env/poetry ; vous devriez avoir la liste des commandes disponibles avec poetry.
  3. Testez également avec un paramètre : bin/env/poetry version ; vous devriez avoir le nom de votre “projet” python et sa version (si vous avez gardé les valeurs par défaut, ce devrait être scripts 0.1.0).
  4. Modifiez ensuite le script bahs bin/python afin d’exécuter la commande python à travers poetry, comme vu plus haut.
  5. N’oubliez pas les petites modifications du README.md, puis commitez avec un message plus complet :
    📦️ [poetry] Installation
    
    🐋 Docker
    =========
    
    * ➕ [python] `poetry` for dependency management
    
    🔨 Scripting
    ============
    
    * ✨ [env::poetry] Provide access to `Poetry` tool
    * [.::python] Use `python` with `poetry`
    
  6. Pushez, puis faites la PR et demandez-moi la review.

2. Script python

Dans une nouvelle branche local-python-monitoring, vous allez créer un script python : bin/src_python/system_monitoring.python dont le but est d’afficher des informations de “system monitoring” telles que l’utilisation CPU ou l’utilisation de la RAM.

Pour ce faire, vous utiliserez la librairie psutil qui permet d’accéder à des informations système ; elle s’installe de la manière suivante : poetry add psutil.

Le script pourra alors être exécuté de la sorte : bin/python bin/src_python/system_monitoring.python.

⚠️ Remarques

  • Lorsqu’il y a une modification des dépendances, les fichiers poetry.lock et pyproject.toml sont modifiées. Ces-dites modifications devraient également être effectives sur les fichiers de votre repository. Sinon, il vous manque quelques options dans le docker run lié à l’utilisation de Poetry…
  • Puisque les containers sont détruits après utilisation, toutes les modifications qui ne sont pas synchronisées avec votre local sont perdues, cela vaut pour l’installation des dépendances…

Pour aller plus loin sur les images…

Au sein de cette partie, vous avez manipulé une image Docker définie par un Dockerfile. Cette dernière est alors disponible sur votre registry local et tous ceux à qui vous partagez le Dockerfile pourraient créer une image très similaire.

Votre image peut également être partagée sur un registry partagé comme celui officiel de Docker, le Docker Hub ou sur un registry privé comme Harbor, ou même les registries mis à disposition par GitHub et GitLab.

Sur la page suivante, nous allons manipuler un peu les images Docker.