welcome: please sign in
location: Änderungen von "SingularityDefinitionFile"
Unterschiede zwischen den Revisionen 2 und 9 (über 7 Versionen hinweg)
Revision 2 vom 2019-06-03 10:12:07
Größe: 6984
Kommentar: Sections
Revision 9 vom 2019-06-11 11:14:32
Größe: 9045
Kommentar: Grammatik
Gelöschter Text ist auf diese Art markiert. Hinzugefügter Text ist auf diese Art markiert.
Zeile 3: Zeile 3:
Ein Defnition-File ist wie eine Blaupause zu verstehen für den Bau eines Containers. Ein Defnition-File ist wie eine Bauanleitung zu verstehen für den [[https://wiki.init.mpg.de/IT4Science/SingularityContainerBauen|Bau eines Containers]].
Zeile 10: Zeile 10:
 * auf welchem OS bzw. Container basierend  * welches OS bzw. Container als Basis dient
Zeile 16: Zeile 16:
== Definition File eines Containers anzeigen ==
 * wird beim Bau eines Singularity Containers in diesen gesichert
 * So ist es möglich, sich das Definition File eines Containers anzeigen zu lassen:
{{{
$ singularity inspect -d CONTAINER.sif
}}}
Zeile 19: Zeile 25:
  * konfigurieren von KernOS-Features
  * Linuxdistribution, genaue Version, Pakete die Teil der Installation sein müssen
  * konfiguriert KernOS-Features
  * Linuxdistribution, genaue Version; Pakete, welche Teil der Installation sein müssen
Zeile 24: Zeile 30:
  * /bin/sh interpreter und akzeptieren /bin/sh optionen
  * ausgeführt zur "build time" oder runtime
  * Befehle werden von /bin/sh interpretiert und akzeptieren /bin/sh Optionen
  * ausgeführt zur Buildtime oder Runtime
Zeile 28: Zeile 34:
 * Bootstrap: Gibt den bootstrap agent an der zum erstellen den Kernsystems genutzt wird   * Bootstrap: Gibt den Bootstrap-Agent an der zum Erstellen des Kernsystems genutzt wird.
Zeile 42: Zeile 48:
 * Jeder Bootstrap-Agent bringt seine eigenen Quellen und Funktionen mit sich. Eine kurze Übersicht der Quellen gibt es [[https://wiki.init.mpg.de/IT4Science/SingularityContainerBauen#Quellen_f.2BAPw-r_Input|hier]] und eine ausführliche Beschreibung der Funktionen ist [[https://www.sylabs.io/guides/3.0/user-guide/appendix.html#build-library-module|hier]] zu finden.
Zeile 43: Zeile 50:
 * wenn ein Befehl fehlschlägt, wird der build-Prozess gestoppt  * Wenn ein Befehl fehlschlägt, wird der Build-Prozess gestoppt.
Zeile 45: Zeile 52:
 * es gibt verschiedenste sections: %setup, %files, %post, %runscript, %startscript, %test, %labels, %help  * Es gibt verschiedenste Sections: %setup, %files, %post, %runscript, %startscript, %test, %labels, %help
Zeile 48: Zeile 55:
 * Befehle, die '''außerhalb den Containers auf dem Host-System''' ausgeführt werden
 * werden ausgeführt, nachdem das KernOS den Container installiert worden ist
 * ContainerFS kann durch Umgebungsvariabe referenziert werden: {{{$SINGULARITY_ROOTFS}}}
 * Befehle, die '''außerhalb den Containers auf dem Host-System''' ausgeführt werden,
 * werden ausgeführt, nachdem das KernOS den Container installiert worden ist,
 * Filesystem des Containers kann durch Umgebungsvariable referenziert werden: {{{$SINGULARITY_ROOTFS}}}
Zeile 59: Zeile 66:
 * für das Kopieren von Files wird %files empfohlen, da %setup mit '''erweiterten Privilegien (Root)''' ausgeführt wird  * Für das Kopieren von Files wird %files empfohlen, da %setup als einzige Section mit '''erweiterten Privilegien (Root)''' ausgeführt wird.
Zeile 63: Zeile 70:
 * jede Zeile besteht aus einem Paar von zwei Pfaden, welche den Quellpfad auf dem Host-System und den Zielpfad im Container angeben
 * der Zielpfad ist optional und ist gleich dem Quellpfad, falls dieser weggelassen werden sollte
 * Jede Zeile besteht aus einem Paar von zwei Pfaden, welche den Quellpfad auf dem Host-System und den Zielpfad im Container angibt.
 * Der Zielpfad ist optional und ist gleich dem Quellpfad, falls dieser weggelassen werden sollte.
Zeile 72: Zeile 79:
=== %envirement ===
 * hier werden Umgebungsvariablen definiert, welche '''zur Runtime''' zur Verfügung stehen
 * Variablen, die hier definiert werden stehen '''nicht''' zu Buildtime zur Verfügung (%post wäre hier die Wahl)
 * es gelten die selben Konventionen wie in den .baschrc oder .profile Files
=== %environment ===
 * Hier werden Umgebungsvariablen definiert, welche '''während der Runtime''' zur Verfügung stehen.
 * Variablen, die hier definiert werden, stehen '''nicht''' während der Buildtime zur Verfügung (%post wäre hier die Wahl).
 * Es gelten die selben Konventionen wie in den .baschrc oder .profile Files.
Zeile 82: Zeile 89:
 * weitere Umgebungsvariablen können während der Runtime in %post definiert werden
 * %envirement schreibt die Umgebungsvariablen in {{{/.singularity.d/env/90-environment.sh}}}
 * in %post definierte Umgebungsvariablen landen in {{{/.singularity.d/env/91-environment.sh}}}
 * %post-Umgebungsvariablen haben Vorrang gegenüber %envirement-Variablen während der Laufzeit 
 * Weitere Umgebungsvariablen können während der Runtime in %post definiert werden.
 * %environment schreibt die Umgebungsvariablen in {{{/.singularity.d/env/90-environment.sh}}}
 * In %post definierte Umgebungsvariablen landen in {{{/.singularity.d/env/91-environment.sh}}}.
 * %post-Umgebungsvariablen haben Vorrang gegenüber %environment-Variablen während der Laufzeit.
Zeile 88: Zeile 95:
 * Befehle werden ausgeführt, '''nachdem das KernOS installiert''' wurde
 * hier werden Dateien heruntergeladen, neue Software und Libraries installiert, Config-Files erstellt, neue Verzeichnisse angelegt, usw.
 * Befehle werden ausgeführt, '''nachdem das KernOS installiert''' wurde.
 * Hier werden Dateien heruntergeladen, neue Software und Libraries installiert, Config-Files erstellt, neue Verzeichnisse angelegt, usw.
Zeile 97: Zeile 104:
 * um neue Umgebungsvariablen zu definieren wird hier {{{$SINGULARITY_ENVIRONMENT}}} benutzt
 * %post-Umgebungsvariablen haben Vorrang gegenüber %envirement-Variablen während der Laufzeit
 * Um neue Umgebungsvariablen zu definieren, wird hier {{{$SINGULARITY_ENVIRONMENT}}} benutzt.
 * %post-Umgebungsvariablen haben Vorrang gegenüber %environment-Variablen während der Laufzeit
Zeile 110: Zeile 117:
 * Konsolenoutput:  * Konsolen-Output:
Zeile 125: Zeile 132:
 * Befehle werden ausgeführt, wenn '''instance start''' Befehl genutzt wird  * Befehle werden ausgeführt, wenn '''instance start''' Befehl genutzt wird, welcher eine Container-Instanz startet.
Zeile 131: Zeile 138:
 * Skript lässt sich starten und stoppen mit:  * Container-Instanz lässt sich starten und stoppen mit:
Zeile 139: Zeile 146:
 * Befehle werden '''am Ende des Build-Prozesses''' ausgeführt  * Befehle werden '''am Ende des Build-Prozesses''' ausgeführt.
Zeile 141: Zeile 148:
 * hier sollten Dinge wie BaseOS-Version, heruntergeladene Dateien und Softwarefunktionalität validiert werden  * Hier sollten Dinge wie BaseOS-Version, heruntergeladene Dateien und Softwarefunktionalität validiert werden.
Zeile 152: Zeile 159:
 * zum Überspringen des Testskripts beim bauen eines Container den Parameter --notest benutzen: {{{$ sudo singularity build --notest my_container.sif my_container.def}}}  * zum Überspringen des Testskripts beim Bauen eines Container den Parameter --notest benutzen: {{{$ sudo singularity build --notest my_container.sif my_container.def}}}
Zeile 155: Zeile 162:
 * Enthält '''Metadaten''', welche in das File /.singularity.d/labels.json im Container abgespeichert werden
 * jede Zeile besteht auch einem Name-Value Paar
 * Enthält '''Metadaten''', welche in das File /.singularity.d/labels.json im Container abgespeichert werden.
 * Jede Zeile besteht auch einem Name-Value-Paar.
Zeile 163: Zeile 170:
 * Metadaten eines Containers (%labels) abrufbar mit $ singularity inspect my_container.sif  * Metadaten eines Containers (%labels) abrufbar mit:
{{{
$ singularity inspect my_container.sif
}}}
Zeile 166: Zeile 176:
 * enthält einen beliebigen Text, welcher mit dem run-help Befehl aufgerufen werden kann: {{{$ singularity run-help my_container.sif}}}
 * hier sollte eine Beschreibung des Containers, ähnlich einer Dokumentation, stehen
 * gerade im Sinne der Reproduzierbarkeit können hier die Versionen der Softwarekomponenten angegeben werden
 * enthält einen beliebigen Text, welcher mit dem "run-help Befehl" aufgerufen werden kann: {{{$ singularity run-help my_container.sif}}}
 * Hier sollte eine Beschreibung des Containers, ähnlich einer Dokumentation, stehen.
 * Gerade im Sinne der Reproduzierbarkeit können hier die Versionen der Softwarekomponenten angegeben werden.
 * Es handelt sich also nur um einem Textbaustein, welcher keine weitere Funktion erfüllt, als als genau dieser angezeigt zu werden. Bei Änderungen des Containers sollte darauf geachtet werden, dass die $help-Section angepasst wird.
Zeile 174: Zeile 185:
  == Zeitliche Einordnung der Komponenten ==
 * Außen vor sind die für Metadaten zuständige Sections %help und %labels, da deren zeitliche Abfolge irrelevant sind.
 * Unterteilung in Build-Prozess und Runtime:
 * Build-Prozess:
  * Zuerst findet das Bootstrapping statt, also das Erstellen eines KernOS im Container.
  * Als nächstes wird das Skript der %setup-Section mit root-Rechten auf dem Host-System ausgeführt.
  * Anschließende Schritte beeinflussen nur noch den Container.
  * Schließlich wird der Build-Prozess mit den Skripten der %files- und %post-Section beendet, ab jetzt ohne erweiterte Privilegien.
  * An den Build-Prozess schließt das Skript der %test-Section an.
 * Runtime:
  * Zuerst werden die Umgebungsvariablen durch die %environment-Section definiert.
  * Je nach Befehl wird das Skript der %runscript-Section (exec, run) oder das Skript der %startscript-Section (start) ausgeführt.
{{attachment:definitionFileTime.png}}

Definition File

Ein Defnition-File ist wie eine Bauanleitung zu verstehen für den Bau eines Containers. Immer absolute Pfade angeben bzw. Umgebungsvariablen benutzen!

Was ist ein Definition File?

Es legt fest:

  • welches OS bzw. Container als Basis dient
  • welche Pakete installiert werden sollen
  • Umgebungsvariablen zur Laufzeit
  • benötigte Files vom Host
  • Metadaten und Beschreibung des Containers

Definition File eines Containers anzeigen

  • wird beim Bau eines Singularity Containers in diesen gesichert
  • So ist es möglich, sich das Definition File eines Containers anzeigen zu lassen:

$ singularity inspect -d CONTAINER.sif

Komponenten

  • Header:
    • beschreibt KernOS bzw. Container mit Quelle
    • konfiguriert KernOS-Features
    • Linuxdistribution, genaue Version; Pakete, welche Teil der Installation sein müssen
  • Sections:
    • optional
    • kann mehrere Instanzen vorhandener Sections enthalten
    • Befehle werden von /bin/sh interpretiert und akzeptieren /bin/sh Optionen
    • ausgeführt zur Buildtime oder Runtime

  • Bootstrap: Gibt den Bootstrap-Agent an der zum Erstellen des Kernsystems genutzt wird.

Bootstrap: library
From: debian:7

oder

Bootstrap: library
From: ubuntu:18.04
  • Jeder Bootstrap-Agent bringt seine eigenen Quellen und Funktionen mit sich. Eine kurze Übersicht der Quellen gibt es hier und eine ausführliche Beschreibung der Funktionen ist hier zu finden.

Sections

  • Wenn ein Befehl fehlschlägt, wird der Build-Prozess gestoppt.
  • Reihenfolge der Sections spielt keine Rolle
  • Es gibt verschiedenste Sections: %setup, %files, %post, %runscript, %startscript, %test, %labels, %help

%setup

  • Befehle, die außerhalb den Containers auf dem Host-System ausgeführt werden,

  • werden ausgeführt, nachdem das KernOS den Container installiert worden ist,
  • Filesystem des Containers kann durch Umgebungsvariable referenziert werden: $SINGULARITY_ROOTFS

  • Beispiel:

%setup
 touch /file1
 touch${SINGULARITY_ROOTFS}/file2
  • file1 wird auf dem Host erstellt (/)
  • file2 wird im Container erstellt (/)
  • Für das Kopieren von Files wird %files empfohlen, da %setup als einzige Section mit erweiterten Privilegien (Root) ausgeführt wird.

%files

  • zum Kopieren von Dateien aus dem Host-System in den Container

  • Jede Zeile besteht aus einem Paar von zwei Pfaden, welche den Quellpfad auf dem Host-System und den Zielpfad im Container angibt.
  • Der Zielpfad ist optional und ist gleich dem Quellpfad, falls dieser weggelassen werden sollte.
  • Beispiel:

%files
 /file1
 /file1 /opt

%environment

  • Hier werden Umgebungsvariablen definiert, welche während der Runtime zur Verfügung stehen.

  • Variablen, die hier definiert werden, stehen nicht während der Buildtime zur Verfügung (%post wäre hier die Wahl).

  • Es gelten die selben Konventionen wie in den .baschrc oder .profile Files.
  • Beispiel:

%environment
 export LISTEN_PORT=12345
 export LC_ALL=C
  • Weitere Umgebungsvariablen können während der Runtime in %post definiert werden.
  • %environment schreibt die Umgebungsvariablen in /.singularity.d/env/90-environment.sh

  • In %post definierte Umgebungsvariablen landen in /.singularity.d/env/91-environment.sh.

  • %post-Umgebungsvariablen haben Vorrang gegenüber %environment-Variablen während der Laufzeit.

%post

  • Befehle werden ausgeführt, nachdem das KernOS installiert wurde.

  • Hier werden Dateien heruntergeladen, neue Software und Libraries installiert, Config-Files erstellt, neue Verzeichnisse angelegt, usw.
  • Beispiel:

%post
 apt-get update && apt-get install -y netcat
 NOW=`date`
 echo "export NOW=\"${NOW}\"" >> $SINGULARITY_ENVIRONMENT
  • Um neue Umgebungsvariablen zu definieren, wird hier $SINGULARITY_ENVIRONMENT benutzt.

  • %post-Umgebungsvariablen haben Vorrang gegenüber %environment-Variablen während der Laufzeit

%runscript

  • Befehle werden zur Runtime ausgeführt (durch singularity run oder exec)

  • Argumente, welche beim Start mitgegeben werden, werden hier genutzt
  • Beispiel:

%runscript
 echo "Container was created $NOW"
 echo "Arguments received: $*"
 exec echo "$@"
  • Konsolen-Output:

$ ./my_container.sif
Container was created Thu Dec  6 20:01:56 UTC 2018
Arguments received:

oder

$ ./my_container.sif this that and the other
Container was created Thu Dec  6 20:01:56 UTC 2018
Arguments received: this that and the other
this that and the other

%startscript

  • Befehle werden ausgeführt, wenn instance start Befehl genutzt wird, welcher eine Container-Instanz startet.

  • Beispiel:

%startscript
 nc -lp $LISTEN_PORT
  • Container-Instanz lässt sich starten und stoppen mit:

$ singularity instance start my_container.sif instance1
$ lsof | grep LISTEN
$ singularity instance stop instance1

%test

  • Befehle werden am Ende des Build-Prozesses ausgeführt.

  • alternativ auch über den test-Befehl ausführbar
  • Hier sollten Dinge wie BaseOS-Version, heruntergeladene Dateien und Softwarefunktionalität validiert werden.
  • Beispiel:

%test
 grep -q NAME=\"U buntu\"/etc/os-release
 if[ $? -eq 0 ]; then
        echo "Container base is Ubuntu as expected."
 else
        echo "Container base is not Ubuntu."
 fi
  • zum Überspringen des Testskripts beim Bauen eines Container den Parameter --notest benutzen: $ sudo singularity build --notest my_container.sif my_container.def

%labels

  • Enthält Metadaten, welche in das File /.singularity.d/labels.json im Container abgespeichert werden.

  • Jede Zeile besteht auch einem Name-Value-Paar.
  • Beispiel:

%labels
 Author d@sylabs.io
 Version v0.0.1
  • Metadaten eines Containers (%labels) abrufbar mit:

$ singularity inspect my_container.sif

%help

  • enthält einen beliebigen Text, welcher mit dem "run-help Befehl" aufgerufen werden kann: $ singularity run-help my_container.sif

  • Hier sollte eine Beschreibung des Containers, ähnlich einer Dokumentation, stehen.
  • Gerade im Sinne der Reproduzierbarkeit können hier die Versionen der Softwarekomponenten angegeben werden.
  • Es handelt sich also nur um einem Textbaustein, welcher keine weitere Funktion erfüllt, als als genau dieser angezeigt zu werden. Bei Änderungen des Containers sollte darauf geachtet werden, dass die $help-Section angepasst wird.
  • Beispiel:

%help
 This is a demo container used to illustrate a def file that uses allsupported sections.

Zeitliche Einordnung der Komponenten

  • Außen vor sind die für Metadaten zuständige Sections %help und %labels, da deren zeitliche Abfolge irrelevant sind.
  • Unterteilung in Build-Prozess und Runtime:
  • Build-Prozess:
    • Zuerst findet das Bootstrapping statt, also das Erstellen eines KernOS im Container.
    • Als nächstes wird das Skript der %setup-Section mit root-Rechten auf dem Host-System ausgeführt.
    • Anschließende Schritte beeinflussen nur noch den Container.
    • Schließlich wird der Build-Prozess mit den Skripten der %files- und %post-Section beendet, ab jetzt ohne erweiterte Privilegien.
    • An den Build-Prozess schließt das Skript der %test-Section an.
  • Runtime:
    • Zuerst werden die Umgebungsvariablen durch die %environment-Section definiert.
    • Je nach Befehl wird das Skript der %runscript-Section (exec, run) oder das Skript der %startscript-Section (start) ausgeführt.

definitionFileTime.png

Beispiel für ein komplettes Definition-File

Bootstrap: library
From: ubuntu:18.04

%setup
touch /file1
touch${SINGULARITY_ROOTFS}/file2

%files
/file1
/file1 /opt

%environment
export LISTEN_PORT=12345
export LC_ALL=C

%post
apt-get update && apt-get install -y netcat
NOW=`date`echo "
export NOW=\"${NOW}\"" >> $SINGULARITY_ENVIRONMENT

%runscript
echo "Container was created $NOW"
echo "Arguments received: $*"exec echo "$@"

%startscript
nc -lp $LISTEN_PORT

%test
grep -q NAME=\"Ubuntu\"/etc/os-release
if[ $? -eq 0 ];then
echo "Container base is Ubuntu as expected."
else
echo "Container base is not Ubuntu."
fi

%labels
Author d@sylabs.io
Version v0.0.1

%help
This is a demo container used to illustrate a def file that uses allsupported sections.

SingularityDefinitionFile (zuletzt geändert am 2019-06-18 15:24:25 durch thunert@cbs.mpg.de)