Écrire un pipeline en bioinformatique, c'est bien ! Le rendre portable c'est encore mieux ! Les bioinformaticiens oublient souvent ce dernier point et rare sont les pipelines qui marchent du premier coup. À vrai dire les circonstances ne sont pas en leur faveur. Un pipeline c'est plein de dépendances d'applications dans telle ou telle version, qu'il faut souvent compiler à la main. Sans oublier les différentes versions de langages comme Python 2 et Python 3. On aimerait bien une fois le pipeline construit, figer le système et le partager avec les utilisateurs, sans qu'ils aient à se soucier de l'installation. Eh bien c'est possible avec les environnements virtuels ! Et j'entends déjà au loin le débat sanglant entre ceux qui utilisent Docker et les autres avec leurs machines virtuelles. Dans cet article, on n'utilisera ni l'un ni l'autre. Mais la dernière née de Canonical : LXD .
LXD ou LXC ?
LXC est un système de virtualisation comme Docker qui contrairement à une machine virtuelle, simule l’environnement d’exécution au lieu d'une machine. L'avantage c'est que c'est vraiment light ! Vous pouvez lancer des milliers de machines containers sans consommer toutes vos ressources.
Le souci avec LXC, c'est qu'il n'est pas aussi facile à installer et manipuler que Docker. Suite à ça, les développeurs de Canonical ont décidé de faire encore plus simple en créant une surcouche appelée LXD. Il s'agit d'un daemon exposant une API REST qui permet de contrôler LXC. Et le client de cette API REST est la commande
1 |
lxc |
.
Attention, pour éviter toutes confusions, les commandes LXC d'avant LXD sont de type
1 |
lxc_create |
. Le client console communiquant avec LXD est la commande
1 |
lxc |
.
Installation de LXD
En supposant que vous êtes sous Ubuntu :
1 2 |
[crayon-675870ffbca22557020590 ]sudo apt install lxd sudo lxd init |
Les serveurs d'images
Les images sont les modèles sur lesquels vos containers vont être crées. En terme technique, un container est une instance d'image. Ces images sont stockées sur des serveurs distants ou locaux. Pour manipuler la liste de ces serveurs, utiliser la commande
1 |
lxc remote |
. Par exemple pour lister les serveurs disponibles :
1 |
[crayon-675870ffbca2c066434712 ]lxc remote list |
Vous devriez alors voir le serveur d'image https://images.linuxcontainers.org appelé tout simplement "images". Il y egalement d'autres adresses de serveur, notamment celle de votre propre serveur. En effet vous pouvez stocker vos propres images et les distribuer sur les machines de votre réseau.
Les images
Pour manipuler les images, utilisez la commande
1 |
lxc image |
. Par exemple, pour lister les images disponibles sur le serveur images : vu précédemment
1 |
lxc image list images :<br> |
Repérer l'image de la dernière version d'Ubuntu (Ubuntu/Xenial)
Les containers
Vous avez repéré votre image ? Maintenant rien de plus simple. Pour lancer votre premier container , tapez la commande suivante :
1 |
[crayon-675870ffbca3a436482103 ]lxc launch images :ubuntu/xenial myfirst |
Cette commande va télécharger l'image et lancer votre container. Vous devriez voir votre container dans la liste des containers actifs en tapant la commande suivante :
1 |
[crayon-675870ffbca42483194949 ]lxc list |
Exécuter une commande depuis le container
Pour entrer dans votre container et explorer son arborescence, il suffit d’exécuter la commande bash se trouvant dans le container. Tapez la commande suivante :
1 |
[crayon-675870ffbca48489606894 ]lxc exec myfirst /bin/bash |
Voila, vous êtes dans votre container en root. Vous pouvez installer des paquets ou tout détruire. Peu importe ce que vous faite, vous êtes isolé dans votre container.
Vous pouvez par exemple écrire un pipeline bioinformatique et installer toutes ses dépendances. Lorsque vous voulez exécuter votre pipeline depuis l'hôte, il suffit de faire :
1 |
[crayon-675870ffbca4f332913172 ]lxc exec myfirst /path/from/container/run/script |
Faire un point de montage
Si vous avez besoin de partager un dossier entre l'hôte et le container, il faut faire un point de montage. La commande suivante, monte le dossier
1 |
/tmp/ |
de l'hôte vers le dossier /host/tmp du container.
1 |
[crayon-675870ffbca59211879632 ]<code>lxc config device add myfirst myfirstDevice disk source=/tmp/ path=/host/tmp |
Exporter votre container comme image
Une fois votre container prêt, vous pouvez l'exporter en tant qu'image et le sauvegarder dans un fichier tar.gz. Tout d'abord publiez le container en tant qu'image myPipeline. L'image est sauvegardée avec toutes les autres images en local.
1 |
[crayon-675870ffbca60544812319 ]lxc publish myfirst –alias=myPipeline –force |
Ensuite pour exporter une image dans un fichier, tapez :
1 |
[crayon-675870ffbca6e858635282 ]<code>lxc image export myPipeline |
Vous vous retrouvez alors avec un fichier de ce genre 0bf450c17cb7034077c83487e0.tar.gz. Vous pouvez l'envoyer à votre copain, qui l'importera dans son propre LXD avec la commande suivante :
1 |
[crayon-675870ffbca75288010927 ]<code>lxc image import 0bf450c17cb7034077c83487e0.tar.gz |
Conclusion
Je pense qu'avec cet article, vous avez l'essentiel pour bien démarrer avec LXD et créer des pipelines portables. N’hésitez pas à vous balader dans la commande
1 |
lxc |
, c'est du même style que git. Je n'ai pas parlé de tous les autres avantages de LXC. Mais rappelez-vous qu'il s'agit d'une API REST. Vous pouvez donc gérer vos containers et vos images sur plusieurs serveurs et clusters de calculs sans vous prendre la tête.
Sinon, il y a le projet Pirus en cours de développement qui vise à créer une application pour lancer des pipelines LXC de façon simple à travers une API REST et des websockets. C'est sous license AGPL et c'est ici https://github.com/REGOVAR/Pirus.
Merci aux relecteurs Kumquatum, Akira, Bebatut
Laisser un commentaire