Comment interagir avec une image Apptainer ?
En préalable de ces explications, il est nécessaire d’avoir installé Apptainer sur votre machine ; voir ce lien pour plus de détails.
Ce tutoriel explicite les principales commandes permettant d’interagir avec une image Apptainer pour générer et manipuler des conteneurs. Les instructions présentées ici sont en principe valables pour tout conteneur Apptainer. Une image sur mesure dédiée à la mise en pratique de ce tutoriel est disponible à cette adresse. En suivant ce lien, vous récupérez une image Apptainer (format de fichier .sif
) qui vous permettra de créer des conteneurs.
L’image que vous avez téléchargée est un fichier relocalisable et renommable, qu’il est recommandé de placer dans un répertoire dédié pour facilement la retrouver ; celui-ci peut-être quelconque, et dans le cadre de ce tutoriel nous assumerons que vous l’avez placée dans un répertoire nommé $HOME/apptainer-images
:
Apptainer : cours accéléré
Cette section s’adresse aux personnes n’ayant pas encore utilisé Apptainer.
La principale manière d’interagir avec l’image se fait en invoquant la commande apptainer
suivie de différents arguments :
- L’argument
run
permet de faire naître un conteneur à partir de l’image, d’invoquer la commande par défaut de l’image dans le conteneur puis de détruire le conteneur.
Note
Si la commande lancée par
apptainer run
acceptait des arguments supplémentaires (ce qui n’est pas le cas ici), il serait possible de les fournir en les ajoutant à la suite.
- L’argument
exec
est similaire à l’argumentrun
mais permet d’invoquer n’importe quelle commande dans le conteneur. Par exemple :
crée un conteneur à partir de l’image $HOME/apptainer-images/tutorial.sif
, invoque la commande echo Hi from the container !
du shell dans le conteneur puis détruit le conteneur.
- l’argument
shell
permet d’ouvrir un shell interactif au sein du conteneur (le promptApptainer>
apparaît alors à gauche de la ligne de commande) et d’y effectuer plusieurs commandes successives, puis d’en sortir en détruisant le conteneur avecexit
ouCrtl+D
. Par exemple :
Remarque
En jouant avec les arguments
exec
etshell
à partir de différentes images, vous remarquerez parfois que le nombre de commandes accessibles depuis le conteneur est très restreint. Dans l’idéal, un conteneur se limite en effet le plus possible aux outils nécessaires à l’exécution du code qu’il contient en s’affrachissant des outils superflus, pour des raisons de portabilité (taille de l’image) et de sécurité.
- l’argument
run-help
permet d’afficher le message d’aide inclus dans l’image.
- l’argument
inspect
permet d’afficher les métadonnées relatives à l’image (auteur de l’image, version, date de création, …)
Il est également possible d’exécuter l’image directement, comme un binaire :
ce qui est strictement équivalent à apptainer run $HOME/apptainer-images/tutorial.sif
Variables d’environnement
Pour leur bon fonctionnement, de nombreux outils requièrent que certaines variables d’environnement soient définies. En principe, un conteneur correctement construit leur définit au préalable des valeurs par défaut pertinentes, mais il est courant qu’un utilisateur souhaite en modifier une (ou plusieurs). Avec Apptainer, il est possible de spécifier la valeur que l’on souhaite donner à une variable d’environnement via le flag --env
.
Par exemple, la commande par défaut lancée par apptainer run $HOME/apptainer-images/tutorial.sif
est la suivante :
où la variable $GREET
est définie pour renvoyer “Welcome” par défaut au sein du conteneur.
La variable $USER
est récupérée pour que sa valeur dans le conteneur soit identique à celle de la machine hôte. Ce fonctionnement n’est pas spécifique à l’image étudiée lors de ce tutoriel, il s’agit d’un des nombreux comportements standards d’Apptainer pour faciliter l’utilisation de conteneurs au sein d’environnements de calcul haute performance.
Ces deux variables d’environmmement peuvent être redéfinies :
ou
Remarque
Dans le cas où l’on modifie
$USER
, il est possible qu’Apptainer affiche un message prévenant que la modification de la variable est acceptée mais dévie du fonctionnement par défaut.
Isolation partielle ou isolation totale
Par défaut, Apptainer n’isole pas totalement le conteneur du système de la machine hôte. Les chemins suivants de la machine hôte sont montés et accessibles par défaut dans le conteneur : $HOME
, $PWD
/sys
, /proc
, /tmp
, /var/tmp
, /etc/resolve.conf
et /etc/passwd
.
Si l’on veut isoler le conteneur de la machine hôte, Apptainer propose différentes options (à adjoindre à apptainer run
, apptainer exec
ou apptainer shell
) :
- l’utilisation du flag
--no-mount
pour délier un ou plusieurs chemins au sein du conteneur, par exemple :
- l’utilisation du flag
--no-home
rend le répertoire$HOME
inaccessible au conteneur (mais$PWD
reste monté) :
Dans ce cas, on voit que
$HOME
existe au sein du conteneur mais ne correspond pas au répertoire de la machine hôte.
- le flag
--containall
isole totalement le conteneur de la machine hôte.
Il est possible, notamment en jouant avec les options précédentes, que le répertoire contenant les éventuels fichiers d’entrée et de sortie requis ne soit pas accessible dans le conteneur ! Il faut alors monter ce dossier manuellement avec le flag --bind
dans le conteneur. Par exemple, on peut imaginer le petit exercice suivant consistant à créer un fichier sur la machine hôte, le rendre accessible au sein du conteneur, en créer une copie dans le conteneur, puis récupérer cette copie sur la machine hôte :