infra_bg
CCIN2P3 Centre de Calcul de l'Institut National de Physique Nucléaire et de Physique des Particules

Apptainer

Guillaume Cochard - CC-IN2P3

ANF USH4HPC - 20 juin 2023

Plan
  • Contenerisation et Apptainer
    • Rappels sur la contenerisation
    • Présentation d'Apptainer
  • Apptainer côté utilisateur
    • Télécharger et utiliser un conteneur
    • Utilisateurs et droits
    • Montages
    • Construire un conteneur
  • Apptainer côté administrateur
    • Installation et configuration
    • Sécurité
Généralités

Bases de la conteneurisation

Bases de la conteneurisation

Sans virtualisation

Virtualisation
  • Pas d'overhead
  • Aucune isolation
  • Aucune personnalisation
  • Difficile d'optimiser le temps de travail (installation, configuration, mises à jour)
  • Nécessite plus de machines
Bases de la conteneurisation

Virtualisation classique

Virtualisation
  • Isolation
  • Personnalisation complète
  • Efficace (temps et coûts)
  • Portabilité
  • Gros overhead
  • Redondance
  • Lourd
Bases de la conteneurisation

Cconteneurisation

Virtualisation
  • Isolation
  • Personnalisation
  • Efficace (temps et coûts)
  • Faible overhead
  • Portabilité
  • Limité par le type d'OS et l'architecture matérielle
Bases de la conteneurisation

Virtualisation

Virtualisation
Singularity

Présentation de l'outil

Docker vs. Singularity

Docker

Orienté micro-services

  • Démon root
  • Couche d'abstraction
  • Images Docker

Singularity

Orienté calcul scientifique

  • Pas de démon
  • Calcul sur GPU
  • Images Docker & Singularity
Logo Docker Logo Singularity
Singularity

Singularity, Kezako ?

  • Initialement développé en Python par Gregory Kurtzer au Lawrence Berkeley National Laboratory
  • Entièrement réécrit en Go fin 2018 par Sylabs qui le maintient aujourd'hui
  • Sylabs propose également différents services:
    • Builder online d'images
    • Banque d'images
    • Keystore
  • Dernière release: 3.1.1 (03/04/19)
  • Documentation
Singularity

Singularity versions 2 et 3

  • Changement de version majeur entre Singularity 2.X et 3.X
  • Parmi les différences et ajouts:
    • Réécriture en Go
    • Changement de format d'image : passage de .simg à .sif
    • Changement de help en run-help
    • Ajout du mode instance
    • Signature des images
Singularity

Utilisation de Singularity

Singularity

Cycle de vie

Cycle de vie - Singularity
Singularity
Cycle de vie - Singularity
Singularity

Singularity

Télécharger un conteneur

Singularity: Télécharger un conteneur

Pour bien commencer !

Veuillez vérifier les éléments suivants:


# Vérifiez votre connexion SSH
# Utilisez vos identifiants destinées à vous connecter sur la ferme
$ ssh -l user cca.in2p3.fr

# Activer l'environment Singularity 3.0.3
$ ccenv singularity 3.0.3
        
Singularity: Télécharger un conteneur

Pull

Depuis Singularity Hub


$ singularity pull shub://vsoch/hello-world
        

Depuis Docker Hub


$ singularity pull docker://hello-world
        
Singularity: Télécharger un conteneur

Build

Depuis Singularity Hub


  $ singularity build hello-world.sif shub://vsoch/hello-world
        

Depuis Docker Hub


  $ singularity build hello-world.sif docker://hello-world
        
Singularity

Singularity

Utiliser un conteneur

Singularity: Utiliser un conteneur

Shell (interactif)


$ singularity shell hello-world.sif
Singularity: Invoking an interactive shell within container...

Singularity hello-world.sif:~/prez> cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
        

Pour quitter:
CTRL-d ou exit

Singularity: Utiliser un conteneur

Exec


$ cat /etc/issue
Ubuntu 18.04.1 LTS

$ singularity exec hello-world.sif cat /etc/issue
Ubuntu 14.04.5 LTS

$ singularity exec hello-world.sif ls /
anaconda-post.log  etc   lib64       mnt   root  singularity  tmp
bin        home  lost+found  opt   run   srv          usr
dev        lib   media       proc  sbin  sys          var
        
Singularity: Utiliser un conteneur

Run



$ singularity run hello-world.sif
RaawwWWWWWRRRR !!
        

Nous verrons plus tard comment définir le runscript.

Singularity: Utiliser un conteneur

Help



# Singularity 2.X
$ singularity help hello-world.simg
No runscript help is defined for this image.

# Singularity 3.X
$ singularity run-help hello-world.sif
        

Nous verrons plus tard comment définir l'aide.

Singularity: Utiliser un conteneur

Inspect


$ singularity inspect hello-world.sif
{
    "org.label-schema.usage.singularity.deffile.bootstrap": "docker",
    "MAINTAINER": "vanessasaur",
    "org.label-schema.usage.singularity.deffile": "Singularity",
    "org.label-schema.schema-version": "1.0",
    "WHATAMI": "dinosaur",
    "org.label-schema.usage.singularity.deffile.from": "ubuntu:14.04",
    "org.label-schema.build-date": "2017-10-15T12:52:56+00:00",
    "org.label-schema.usage.singularity.version": "2.4-feature-
squashbuild-secbuild.g780c84d",
    "org.label-schema.build-size": "333MB"
}
        
Singularity

Singularity

Utilisateurs et droits

Singularity: Utilisateurs et droits

  user1@hst:~/prez$ singularity shell hello-world.sif
  Singularity hello-world.sif:~/prez> whoami
  user1
  Singularity hello-world.sif:~/prez> id
  uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),[…]
        

→ Le conteneur s'execute en conservant le même utilisateur.

Singularity: Utilisateurs et droits

user1@hst:~/prez$ su test

test@hst:/home/user1/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~> whoami
test
Singularity hello-world.sif:~> id
uid=1001(test) gid=1001(test) groups=1001(test),4(adm),[...]
        

→ Pas besoin de compte root pour executer le conteneur.

Singularity

Singularity

Montages

Singularity: Montages

Montages par défaut

  • /home/${USER}
  • /tmp
  • /proc, /sys, /dev

user1@hst:~/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~/prez> pwd
/home/user1/prez

test@hst:/home/guillaume/prez$ singularity shell hello-world.sif
Singularity hello-world.sif:~> pwd
/home/test
Singularity hello-world.sif:~> ls /home/user1
ls: cannot access /home/user1: No such file or directory
        
Singularity: Montages

Montages et exécution


Remarque:
L'image est par défaut en read-only.
Seuls les montages seront en read-write.

Singularity: Montages

Monter d'autres répertoires


Utilisation de --bind ou -B
→ -B src:dst


$ ls ~/tests
test.py

$ singularity shell -B ~/tests:/mnt hello-world.sif
Singularity hello-world.sif:~/prez> ls /mnt
test.py
        
Singularity: Montages

Monter d'autres répertoires

Possibilité d'omettre dst si src == dst:


$ cat /mnt/test.txt
Ceci est un test

$ singularity shell -B /mnt hello-world.sif
Singularity hello-world.sif:~/prez> cat /mnt/test.txt
Ceci est un test
        

Possibilité de monter plusieurs points:


$ singularity shell -B /mnt,~/tests:/mnt1 hello-world.sif
        
Singularity: Montages

Monter d'autres répertoires


Possibilité d'indiquer si montage lecture seule ou non

  • -B src:dst[:ro|:rw]
  • Défaut: rw

$ singularity shell -B ~/tests:/mnt:ro hello-world.sif

$ singularity shell -B ~/tests:/mnt:rw hello-world.sif
        
Singularity: Montages

Monter d'autres répertoires

Overlay: montage sur un répertoire non-existant
→ Activé par défaut


$ singularity shell -B /mnt:/mnt1 hello-world.sif
        
Singularity: Montages

Exercice

  • Utilisation de Singularity 3.1.1 (sans aucun montage par défaut, sans overlay)
  • Point de montage : /mnt

ccenv singularity 3.1.1
cd ~
echo "It's alive!" > test.txt
$ singularity exec -B [...] hello-world.sif cat [...]/test.txt
It's alive!
        
Singularity

Singularity

Construire un conteneur

Singularity: Construire un conteneur

Recipes

  • Permet de construire un conteneur personnalisé
  • Construit from scratch ou depuis un conteneur (Docker/Singularity Hub)
  • Supporte de nombreuses distributions
  • Deux principales sections:
    • Header (obligatoire): décrit l'OS
    • Sections (optionnelles): décrit la configuration de l'OS
How to @ CC-IN2P3

Intégration continue avec Gitlab

Utiliser l'intégration continue pour construire son image ?

  • Eviter un temps de build long en local
  • Eviter d'avoir à récupérer les dépendances en local
  • Profiter du système d'archivage
  • Ajouter des tests unitaires
How to @ CC-IN2P3

Intégration continue avec Gitlab

  • Connectez-vous sur gitlab.in2p3.fr
  • Créez un nouveau projet dans votre espace personnel
  • Ajoutez les fichiers relatifs à votre projet
  • Créez un fichier .gitlab-ci.yml
  • Ajouter le contenu de la template ci-après dans le fichier gitlab-ci.yml
  • Le système de CI va automatiquement cloner votre projet et lancer le build
How to @ CC-IN2P3

Intégration continue avec Gitlab


singularity:
  image: "gitlab-registry.in2p3.fr/cc-in2p3-containers/singularity-docker/3.1.1:latest"
  script:
    - singularity build myimg.sif Singularity.def
  artifacts:
    name: myimg.sif
    paths:
      - ./myimg.sif
        

Versions de singularity disponibles: 2.5.1, 2.5.2, 2.6.0, 2.6.1, 3.0.0, 3.0.1, 3.0.2, 3.0.3, 3.1.0, 3.1.1

Singularity

Singularity

Construire un conteneur

Partie 1: le Header

Singularity: Construire un conteneur - Header
  • Décrit l'OS:
    • Source (hub, scratch)
    • Version
    • Paquet(s) à inclure
  • Supporte les sources suivantes:
    • shub (images hosted on Singularity Hub)
    • docker (images hosted on Docker Hub)
    • localimage (images saved on your machine)
    • yum (yum based systems like CentOS or Scientific Linux)
    • debootstrap (apt based systems like Debian or Ubuntu)
    • arch (Arch Linux)
    • busybox
    • zypper (zypper based systems like Suse or OpenSuse)
Singularity: Construire un conteneur - Header

Build depuis Docker Hub


Bootstrap: docker
From: ubuntu
        

$ sudo singularity build ubuntu.sif ubunturecipe
Using container recipe deffile: ubunturecipe
Sanitizing environment
Adding base Singularity environment to container
Docker image path: index.docker.io/library/ubuntu:latest
[...]
Building Singularity image...
Singularity container built: ubuntu.sif
Cleaning up…
        
Singularity: Télécharger un conteneur

Build

Attention lorsque vous buildez plusieurs fois une image en faisant des modifications successives, pensez à supprimer la précédente car Singularity ne gère pas correctement la réécriture des données !

Singularity: Construire un conteneur - Header

Debootstrap

  • Nécessite l'installation du paquet debootstrap
  • Format:

Bootstrap: debootstrap
OSVersion: bionic
MirrorURL: http://us.archive.ubuntu.com/ubuntu/
Include: somepackage
        
  • OSVersion
    • Ubuntu: bionic, xenial, etc.
    • Debian: stable, oldstable, etc. ou jessie, stretch, etc.
Singularity

Singularity

Construire un conteneur

Partie 2: les Sections

Singularity: Construire un conteneur - Sections
  • Configure le conteneur
  • Sections possibles (toutes optionnelles):
    • Informations
      • Help
      • Labels
    • Configuration et personnalisation
      • Setup
      • Files
      • Environment
      • Post
    • Execution
      • Runscript
      • Test
Singularity: Construire un conteneur - Sections

Help

Affiche une aide lorsque demandé


Bootstrap: docker
From: ubuntu

%help
Ceci est mon conteneur
        

$ sudo singularity build ubuntu.sif ubunturecipe
$ singularity run-help ubuntu.sif
Ceci est mon conteneur
        
Singularity: Construire un conteneur - Sections

Labels

Enregistre des métadonnées personnalisées


%labels
    Maintainer User1
    MyLabel LabelToRuleThemAll
        

$ singularity inspect ubuntu.sif
{
    "MAINTAINER": "User1",
    "MYLABEL": "LabelToRuleThemAll",
}
        
Singularity: Construire un conteneur - Sections

Setup

Commandes exécutées par l'OS hôte après le build de l'image de base


%setup
    touch ${SINGULARITY_ROOTFS}/test1
    touch test2
        

user1@hst:~/prez$ singularity exec ubuntu.sif ls /
bin  boot  dev	environment  etc  home	lib  lib64  media  mnt	opt  proc
root  run  sbin  singularity  srv  sys  test1  tmp  usr  var
user1@hst:~/prez$ ls
test2  ubunturecipe  ubuntu.sif
        
Singularity: Construire un conteneur - Sections

Files

Copie de fichiers depuis l'OS hôte vers le conteneur.
Basé sur cp.


$ touch test{1,2,3}

$ cat ubunturecipe
[...]
%files
    test* /opt
        

$ singularity exec ubuntu.sif ls /opt
test1 test2 test3
        
Singularity: Construire un conteneur - Sections

Environment

Définit des variables d'environnement utilisées après le build


%environment
    export SCRIPT_OPT=option
        

$ singularity inspect -e ubuntu.sif
    export SCRIPT_OPT=option
$ singularity exec ubuntu.sif echo $SCRIPT_OPT
$ singularity shell ubuntu.sif
Singularity ubuntu.sif:~/prez> echo $SCRIPT_OPT
option
        
Singularity: Construire un conteneur - Sections

Post

Commandes executées dans le conteneur
Etape principale pour la personnalisation
Attention ! Pas de commande interactive


%post
    apt-get update
    apt-get install -y python3
        

$ singularity exec ubuntu.sif python3
Python 3.6.7
>>>
        
Singularity: Construire un conteneur - Sections

Runscript (1/2)

Définit les commandes à lancer lorsqu'on exécute le conteneur (run)
Simplifie l'utilisation du conteneur au détriment de sa polyvalence


$ cat ubunturecipe
[...]
%runscript
    echo "This is a runscript"
        

$ singularity run ubuntu.sif
This is a runscript
        
Singularity: Construire un conteneur - Sections

Runscript (2/2)

Pour pouvoir interpréter les arguments passés en paramètres lors du lancement du conteneur avec la commande run, il faut utiliser "$@".

Exemple:


%runscript
  python /opt/myscript.py "$@"

$ singularity run mycontainer.sif arg1 arg2
        
How to @ CC-IN2P3

Singularity au CC-IN2P3

How to @ CC-IN2P3

Ressources

CVMFS banque d'images fournies par le CC-IN2P3
PBS vos images
Gitlab CI artifacts des jobs

Les images de CVMFS sont organisés par usage (HPC/HTC, CPU/GPU, ...) et sont maintenus par le CC-IN2P3

How to @ CC-IN2P3

Ressources

Dans /pbs, vous disposez d'un:

  • HOME: /pbs/home (20Go) personnel
  • THRONG: /pbs/throng (100Go partagés) pour le groupe

Pour uploader vos images dans votre HOME:


scp mycontainer.sif formationX@cca.in2p3.fr:
        
How to @ CC-IN2P3

Contexte d'execution et restrictions

  • Version 2.6, 3.0.3 et 3.1.1 installée sur les Workers
  • Pas de montage du répertoire /home par défaut (et /tmp en plus pour la 3.1.1)
  • Pas de root, pas de build !
  • Accessible via le scheduler batch
How to @ CC-IN2P3

Singularity sur la ferme

Pour soumettre un job utilisant une image singularity 2.X sur la ferme batch:

  • Création d'un wrapper
  • Soumission de ce wrapper avec qsub

-- hello.sh --
#!/bin/bash
/bin/singularity exec /cvmfs/singularity.in2p3.fr/images/
  HTC/ubuntu/ubuntu1804-CC3D.simg /bin/hostname

-- Execution du wrapper --
$ qsub -q long /pbs/home/john/hello.sh
        
How to @ CC-IN2P3

Singularity sur la ferme (2)

Pour soumettre un job utilisant une image singularity 3.X sur la ferme batch depuis une interactive:

  • Activer la version de singularity

# Lister les version de singularity disponible
ccenv singularity --list
Software:
  Version:
    singularity:
    - 3.0.3
# Activer une version
ccenv singularity 3.0.3
        
  • Créer un wrapper et le soumettre avec qsub
How to @ CC-IN2P3

Singularity sur la ferme (3)

Pour soumettre un job utilisant une image singularity 3.X sur la ferme batch depuis un worker:

  • Activer la version de singularity

source /pbs/software/centos-7-x86_64/singularity/ccenv.[c]sh 3.0.3
        
  • Créer un wrapper et le soumettre avec qsub
How to @ CC-IN2P3

Singularity sur la ferme (5)

Comment soumettre un job utilisant les GPUs ?

Voisinage de la ferme
Voisinage
Catalogue d'images (1/3)

Le Catalogue répertorie les images disponibles ainsi que les modules python de Deep Learning compatibles
https://gitlab.in2p3.fr/ccin2p3-support/c3/hpc/gpu

Catalogue d'images
Catalogue d'images (2/3)

La description des logiciels installés se trouve dans les Labels


$ singularity inspect centos7_cuda10-1_cudnn7-5_nccl2-4-2.simg
  "org.label-schema.build-date": "Thu,_21_Mar_2019_14:53:06_+0100",
  "AUTHOR": "Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr",
  "org.label-schema.usage.singularity.deffile.osversion": "7",
  "MAINTAINER": "Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr",
  "DESCRIPTION": "Singularity CentOS 7 image with CUDA 10.1, CUDnn 7.5 and NCCL 2.4.2",
  "org.label-schema.usage.singularity.version": "2.6.1-dist",
  "org.label-schema.usage.singularity.deffile.include": "yum",
  "org.label-schema.schema-version": "1.0",
  "org.label-schema.usage.singularity.deffile.bootstrap": "yum",
  "OS": "OS CentOS Linux release 7.6.1810 (Core)",
  "CUDA": "cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm (https://developer.download.nvidia.com)",
  "NCCL": "nccl_2.4.2-1+cuda10.1_x86_64.txz (https://developer.nvidia.com/nccl - registration required)",
  "CUDNN": "cudnn-10.1-linux-x64-v7.5.0.56.tgz (https://developer.nvidia.com/cudnn - registration required)",
  "org.label-schema.build-size": "8791MB",
  "ORGANIZATION": "CC-IN2P3 / CNRS",
  "DEF_FILE_REPO": "https://gitlab.in2p3.fr/ccin2p3-support/c3",
  "org.label-schema.usage.singularity.deffile.mirrorurl": "http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/",
  "org.label-schema.usage.singularity.deffile": "centos7_cuda10-1_cudnn7-5_nccl2-4-2.def"
        
Catalogue d'images (3/3)

Le fichier de définition est aussi mis à disposition


BootStrap: yum
OSVersion: 7
MirrorURL: http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/
Include: yum
%labels
  ORGANIZATION CC-IN2P3 / CNRS
  AUTHOR Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr
  MAINTAINER Bertrand Rigaud bertrand.rigaud@cc.in2p3.fr
  DESCRIPTION Singularity CentOS 7 image with CUDA 10.1, CUDnn 7.5 and NCCL 2.4.2
  OS OS CentOS Linux release 7.6.1810 (Core)
  CUDA cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm (https://developer.download.nvidia.com)
  CUDNN cudnn-10.1-linux-x64-v7.5.0.56.tgz (https://developer.nvidia.com/cudnn - registration required)
  NCCL nccl_2.4.2-1+cuda10.1_x86_64.txz (https://developer.nvidia.com/nccl - registration required)
  DEF_FILE_REPO https://gitlab.in2p3.fr/ccin2p3-support/c3
%files
  cuda-repo-rhel7-10-1-local-10.1.105-418.39-1.0-1.x86_64.rpm /opt/cuda.rpm
  cudnn-10.1-linux-x64-v7.5.0.56.tgz /opt/cudnn.tgz
  nccl_2.4.2-1+cuda10.1_x86_64.txz /opt/nccl.txz
%post
  yum install -y wget bzip2 zip unzip tar.x86_64 which elfutils-libelf-devel file gzip kernel-devel-uname-r kmod systemd git patch vim
  ## Install CUDA 10.1 ##
  wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -O /opt/dkms.rpm
  rpm -ivh /opt/dkms.rpm
  yum install -y dkms
  rm /opt/dkms.rpm
  rpm -ivh /opt/cuda.rpm
  yum install -y cuda
  rm /opt/cuda.rpm
  ## Install CUDNN 7.5 ##
  tar -xvzf /opt/cudnn.tgz -C /opt
  mv /opt/cuda/lib64/* /usr/local/cuda/lib64/
  mv /opt/cuda/include/* /usr/local/cuda/include/
  ## Install NCCL 2.4.2 ##
  tar -xvf /opt/nccl.txz -C /opt
  mv /opt/nccl_2.4.2-1+cuda10.1_x86_64/lib /usr/local/cuda/
  mv /opt/nccl_2.4.2-1+cuda10.1_x86_64/include/* /usr/local/cuda/include/
  echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> $SINGULARITY_ENVIRONMENT
  echo 'export PATH=/usr/local/cuda/bin:/opt/conda/bin:/opt/bazel/output:$PATH' >> $SINGULARITY_ENVIRONMENT
  mkdir /afs /scratch /sps /pbs /cvmfs /cvmfscache
        
Workflow
Workflow
Soumission sur le système de batch

commande de soumission (depuis une machine interactive)


qsub -l sps=1,GPU=<nb_gpus>,GPUtype=<K80-V100> -q <queue> -pe multicores_gpu 4
-o <output_path> -e <error_path> -V <path_to>/batch_launcher.sh
        

batch_launcher.sh (executé sur le worker)


#!/bin/bash
/bin/singularity exec --nv --bind /sps:/sps --bind /pbs:/pbs <image_path> <path_to>/start.sh
        

start.sh (executé à travers l'image Singularity sur le worker)


#!/bin/bash
source <path_to_python_env> activate <env>
python <path_to>/program.py
        
Singularity: Notions avancées

Singularity

Notions avancées

Singularity: Notions avancées

Signatures d'images

Depuis Singularity > 3.0, possibilité de signer (avec GPG) et vérifier des conteneurs.
Pour cela, plusieurs étapes:

  • Générer une paire de clés
  • Stocker ses clés
  • Signer un conteneur
  • Vérifier un conteneur
Singularity: Notions avancées

Signatures d'images - Générer une pair de clés


singularity keys newpair
        

Il faudra fournir:

  • un nom
  • un email
  • une description (optionnelle)
  • un mot de passe (fortement recommandé)
Singularity: Notions avancées

Signatures d'images - Stockage des clés

Par défaut les clés sont stockées dans ${HOME}/.singularity/sypgp
Pour lister les clés publiques locales:


singularity keys list
0) (U)ser: Jean Bon (preprod-key) <jean.bon@example.com>
   (C)reation date & time: 2019-04-23 07:24:34 +0000 UTC
   (F)ingerprint: 289ECC21945F0C495ADB0DC1B99C0CD7AF36AE97
   (L)ength: 4096
   --------
        

Stockage des clés dans un keystore public en utilisant la commande push.

Singularity: Notions avancées

Signatures d'images - Signature & vérification d'un conteneur


# L'option -k permet de spécifier la clé à utiliser
# (cf singularity key list)

$ singularity sign mycontainer.sif

$ singularity verify mycontainer.sif

Verifying image: mycontainer.sif
Data integrity checked, authentic and signed by:
  Jean Bon (preprod-key) <jean.bon@example.com>, KeyID B99C0CD7AF36AE97
        
Singularity: Notions avancées

Applications: une image, plusieurs usages

Différentes applications avec des dépendances communes:
plusieurs conteneurs → un seul conteneur avec des layers différents: les apps

Apps
Singularity: Notions avancées

Définition d'une app(1/2)

Sections équivalentes à une recette standard:

  • %apphelp → %help
  • %applabels → %labels
  • %appenv → %environment
  • %appinstall → %post
  • %appfiles → %files
Singularity: Notions avancées

Définition d'une app (2/2)

Exemple de recette contenant 2 apps:


Bootstrap: docker
From: debian

%apphelp app1
  "This is the help section for app1"
%appinstall app1
  apt-get install -y sl
%apprun app1
  exec /usr/games/sl

%apphelp app2
  "This is the help section for app2"
%appenv app2
  export APP=app2
%applabels app2
  APP app2
%appinstall app2
  touch test.exec
        
Singularity: Notions avancées

Execution d'une app

Pour executer une app en particulier, il faut la spécifier lors du lancement du conteneur:


$ singularity run --app app1 mycontainer.sif

$ singularity exec --app app1 mycontainer.sif env | grep APP
APP=app2
        
Singularity: Notions avancées

Execution en service: les instances (1/3)

Permet de lancer un conteneur en mode démon afin qu'il s'execute en arrière plan.

Exemple: Serveur web nginx


Bootstrap: docker
From: nginx
Includecmd: no

%startscript
   nginx
        
Singularity: Notions avancées

Execution en service: les instances (2/3)

Démarrer une instance:


[command]                     [image]     [name of instance]
$ singularity instance start  alpine.sif  instance1
        

Lister les instances en cours d'exécution:


$ singularity instance list
INSTANCE NAME    PID      IMAGE
instance1        1337     /home/john/alpine.sif
        
Singularity: Notions avancées

Execution en service: les instances (3/3)

Lancer des actions dans l'instance:


$ singularity [run | exec | shell] instance://instance1
        

Stopper une instance:


$ singularity instance stop instance 1
        
Singularity: Notions avancées

Support des Cgroups

  • Depuis Singularity 3.0
  • Définition dans un fichier TOML
  • Permet de limiter les ressources utilisées par un conteneur
  • Doit être appliqué au lancement du conteneur
  • Gère les restrictions CPU, RAM, IO, Accès
Session pratique

Hands-on

Hands-on

But

Nous allons vous fournir deux fichiers :

  • nddp_image.pdf
  • ocr.py

ccenv singularity 3.0.3
$ singularity run ubuntu-ocr.sif /path/to/nddp_image.pdf
        

Sorties :

  • output_raw.txt
  • output.png
Hands-on

Difficultés

Trois niveaux de difficulté :

  • Build sans compilation et avec Singularity 3.0.3
  • Utilisation de Singularity 3.1.1 (aucun montage par défaut)
  • Build avec compilation (attention : build de ~17 minutes)
Hands-on

Rappels

  • Build des images: sur GitLab
  • Pas de droits root sur les worker
  • Tout ce dont vous avez besoin a été présenté hier

Connexion à un worker:


$ ssh -l formationX cca.in2p3.fr
        
Hands-on

Instructions

Repository du TP: Support formation

Nous allons vous demander d'écrire une recette de conteneur, de le builder et de l'exécuter sur un worker (machine cca).