Conteneur et système de fichiers

Jusqu'à présent notre utilisation des conteneurs a été rudimentaire. Une fonctionnalité qui va nous ouvrir de premières possibilités intéressantes est le partage de fichiers entre le conteneur et le système hôte.

Imaginons que nous voulions lancer un script Python très classique qui est donné si dessous :

1
import sys
2
def fibo(n):
3
  if n==1 or n==2: return 1
4
  return fibo(n-1) + fibo(n-2)
5
print( fibo(int(sys.argv[1])) )

C'est un script très basique (et mal écrit) qui va simplement calculer afficher le nombre de Fibonnaci correspondant à un entier. Pas besoin de connaître le Python, nous allons simplement vouloir l'exécuter sans installer Python sur notre machine. Pour cela 2 possibilités :

  1. on copie manuellement ce script dans notre conteneur

  2. on utilise un point de montage pour partager ce script avec notre conteneur

Il est évident que la solution 1 n'est pas viable. À chaque fois que l'on créé un nouveau conteneur, celui-ci démarre sur le système de fichier de l'image qu'il va utiliser. Ce qui veut donc dire que, à chaque fois que l'on va redémarrer le conteneur, il sera nécessaire de copier le script manuellement. Nous allons donc utiliser une fonctionnalité intéressante de Docker : les bind mounts. C'est un mécanisme très simple qui permet de partager un dossier du système hôte avec le conteneur, grâce à l'option -v /chemin/sur/hote:/chemin/dans/conteneur au démarrage d'un conteneur.

Ici imaginons que le script Python ci-dessus soit placé sur notre serveur dans le dossier ~/scripts. On peut lancer la commande suivante pour exécuter notre script à l'aide de l'image Python en version 3 :

1
docker run -it -v ~/scripts:/code python:3 python /code/fibo.py 16

Cette commande va lancer un conteneur (en mode interactif) et monter le contenu du dossier ~/scripts dans le dossier /code du conteneur. Puis le conteneur va lancer la commande python /code/fibo.py 16 qui permet simplement d’appeler le script avec le paramètre 16.

Remarque

Les bind-mounts fonctionnent aussi bien sur les dossiers que les fichiers, mais il faut alors préciser leurs noms des deux côtés.