Montage de volumes

Comme mentionné dans le précédent paragraphe, par défaut toute modification effectuée à l’intérieur du container sera perdue une fois le container définitivement stoppé.

Plaçons nous dans le cadre où un enseignant souhaite mettre à la disposition des étudiants un environnement de développement en Python 3 avec la bibliothèque NumPy intégrée. Cette bibliothèque propose en particulier un ensemble de fonctions prédéfinies pour traiter des problèmes d’algèbre linéaire. Pour traiter cet exemple, nous utiliserons le container strayge/alpine-py3-numpy-scipy suite au résultat donné par la commande docker search numpy. Rappelons que pour installer ce container, il suffit d’exécuter la commande :

% docker pull strayge/alpine-py3-numpy-scipy

Une fois installé, il faut cette fois-ci lancer le container en mode interactif (option -ti) afin de pouvoir accéder à l’interprète python.

% docker run -ti strayge/alpine-py3-numpy-scipy
Python 3.5.2 (default, Nov 17 2016, 22:46:45)
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

A ce stade se pose le problème suivant : le système de fichiers du container et le système de fichiers de la machine hôte sont totalement indépendants et l’interprète python du container ne peut accéder qu’au système de fichier du container. Si un étudiant souhaite utiliser l’interprète disponible dans le container, il n’y a que deux solutions envisageables :

  • développer dans le container
  • disposer d’une méthode permettant au container d’accéder au système de fichier hôte.

Nous allons commencer par décrire la solution 1 et voir en quoi elle n’est pas satisfaisante, mais cette description sera un prétexte pour parler de la sauvegarde des modifications effectuées dans un container.

Travailler dans le container

Pour développer dans le container, il faut pouvoir accéder à un shell nous permettant de lancer un éditeur de texte, ce qui suppose au préalable qu’un tel éditeur soit installé. Il se trouve que dans le container strayge/alpine-py3-numpy-scipy, l’utilitaire busybox est installé. Busybox est un programme exécutable regroupant en son sein un certain nombre d’utilitaires Unix, cf. https://busybox.net. Il a été développé pour des distributions Linux dédiées au monde de l’embarqué. Busybox intègre par défaur l’éditeur de texte vi. Ce n’est certainement pas l’éditeur de texte le plus adapté pour des débutants, ni le plus adapté pour écrire du python mais il va nous permettre de continuer à illustrer notre exemple. Pour obtenir un shell au lieu de lancer directement l’interpète python, il faut lancer le container en lui spécifiant le nom de la commande à exécuter:

% docker run --name python3 -ti strayge/alpine-py3-numpy-scipy /bin/sh
/ #

on se retrouve alors à la racine du système de fichiers du container. Créons un répertoire pour stocker nos scripts python et éditons notre premier script.

/ # cd /home
/home # mkdir PYTHON
/home # cd PYTHON
/home/PYTHON # vi matrice.py

Le script matrice.py utilisera la bibliothèque numpy afin de transposer une matrice :

import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8]])
print(np.transpose(A))

il ne reste plus qu’à l’exécuter :

/home/PYTHON # python matrice.py
[[1 5]
 [2 6]
 [3 7]
 [4 8]]

Si on quitte et on relance le container toutes ces modifications sont perdues.

/home/PYTHON # exit
% docker run -ti strayge/alpine-py3-numpy-scipy /bin/sh
/ # ls /home
/ #

Afin de conserver ce qui vient d’être fait, il ne faut pas quitter le container et sauvegarder à partir d’un autre terminal de commande son état actuel.

Supposons donc que notre container soit toujours actif et ouvrons un nouveau terminal afin de sauvegarder son état actuel:

% docker commit -m "premiere modification container" python3 veron/monpython:v1

L’option commit signife que l’on souhaite enregistrer l’état actuel du container, l’option -m permet d’ajouter un commentaire, il faut ensuite spécifier le container à sauvegarder (ici nous avons utilisé le nom python3, nom que nous avions attribué au container strayge/alpine-py3-numpy-scipy lors de son lancement), et enfin il faut donner un nom au nouveau container ainsi créé sous la forme nom/version.

On peut voir qu’effectivement un nouveau container a été créé:

% docker images
REPOSITORY                       TAG         IMAGE ID            CREATED             SIZE
veron/monpython                  v1          171769afb1b8        2 minutes ago       645MB
strayge/alpine-py3-numpy-scipy   latest      370529855de7        2 years ago         645MB

Le commentaire ajouté lors du commit peut être obtenu en utilisant l’option history de docker:

% docker history --format "{{.Comment}}"  monpython/v1
premiere modification container

Quittons donc notre container python3 et chargeons monpython/v1 pour constater que les modifications effectuées dans python3 ont bien été sauvegardées:

/home/PYTHON # exit
% docker run --name monpython3 -ti veron/monpython:v1 /bin/sh
/ # cd /home/PYTHON/
/home/PYTHON # cat matrice.py
import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8]])
print(np.transpose(A))

Cette solution est évidemment loin d’être satisfaisante. Elle oblige d’avoir un container pour chaque étudiant. Chaque étudiant doit penser à sauvegarder son container à chaque modification. Elle oblige l’étudiant à développer avec les outils « rudimentaires » disponibles dans le container. Finalement, une fois le container stoppé, l’étudiant ne peut plus avoir accès à ses sources python.

Nous allons maintenant détailer une solution plus appropriée permettant à un étudiant d’utiliser n’importe quel éditeur de texte disponible sur le système hôte et de sauvegarder son travail sur le système de fichiers hôte.

Accéder au système de fichier hôte

L’option –volume de docker permet de monter un répertoire du système hôte sur un point de montage dans le container. La syntaxe est –volume répertoire_hôte:point_de_montage_container. Repartons du container initial strayge/alpine-py3-numpy-scipy. Créons dans notre répertoire de travail sur le système hôte un répertoire PYTHON et associons le à un point de montage MONPYTHON dans le /home du container (inutile de créer ce répertoire).

% pwd
/home/pascal
% mkdir PYTHON
% docker run --name monpython --volume /home/pascal/PYTHON:/home/MONPYTHON -ti strayge/alpine-py3-numpy-scipy /bin/sh
# / cd /home/MONPYTHON
/home/MONPYTHON #

On peut maintenant utiliser n’importe quel éditeur de texte pour saisir le script matrice.py et le sauvegarder dans /home/pascal/PYTHON. Ce script apparaîtra automatiquement dans le répertoire /home/MONPYTHON du container.

/home/MONPYTHON # ls
matrice.py
/home/MONPYTHON # python matrice.py
[[1 5]
 [2 6]
 [3 7]
 [4 8]]