Größe: 7940
Kommentar: Rechtschreibung + zeitliche Einordnung
|
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 73: | Zeile 80: |
* 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 |
* 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 | * Weitere Umgebungsvariablen können während der Runtime in %post definiert werden. |
Zeile 84: | Zeile 91: |
* in %post definierte Umgebungsvariablen landen in {{{/.singularity.d/env/91-environment.sh}}} * %post-Umgebungsvariablen haben Vorrang gegenüber %environment-Variablen während der Laufzeit |
* 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 | * Um neue Umgebungsvariablen zu definieren, wird hier {{{$SINGULARITY_ENVIRONMENT}}} benutzt. |
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: |
Zeile 176: | Zeile 187: |
* außen vor sind die für Metadaten zuständige Sections %help und %labels, da deren zeitliche Abfolge irrelevant sind | * Außen vor sind die für Metadaten zuständige Sections %help und %labels, da deren zeitliche Abfolge irrelevant sind. |
Zeile 179: | Zeile 190: |
* zuerst findet das Bootstrapping statt, also das hinzufügen eines KernOS bzw. Containers in den leeren 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 |
* 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. |
Zeile 183: | Zeile 194: |
* an den Build-Prozess schließt das Skript der %test-Section an | * An den Build-Prozess schließt das Skript der %test-Section an. |
Zeile 185: | Zeile 196: |
* 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 |
* 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!
Inhaltsverzeichnis
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
Header
- Bootstrap: Gibt den Bootstrap-Agent an der zum Erstellen des Kernsystems genutzt wird.
möglich: library, docker, shub, localimage, yum, debootstrap, arch, busybox, zypper (genaueres in Doku: https://www.sylabs.io/guides/3.2/user-guide.pdf)
- Beispiel für einen Header:
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.
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.