Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Apptainer je vrlo jednostavan za korištenje. Koristi korištenjem, i koristi se kao bilo koja druga aplikacija (ne pokreće se servis kao npr. u slučaju Dockera - zato dobro radi s raspoređivačima poslova!).

...

  •  build: naredba za izgradnju kontejnera
  •  exec: naredba za izvršavanje naredbe u kontejneru
  •  inspect: naredba za gledanje labela, runscripti, test scripti te varijabli okoline
  •  pull: naredba za povlačenje slika sa Singularity ili Docker Huba
  •  run: naredba za pokretanje slike kao izvršne datoteke
  •  shell: naredba za pokretanje ljuske u kontejneru

Izgradnja kontejnera

build može kreirati kontejnere u dva različita formata:

  1. image - temeljen na SquashFSu u formatu read-only
  2. sandbox - u formi direktorija, pogodni za interaktivnu modifikaciju kontejnera opcijom --writable

Osim izgradnje, naredbom build može se konvertirati između image i sandbox formata, ili izgraditi kontejnere iz Apptainer recepta zvanih definition files.

Izgradnja kontejnera iz Apptainer recepta preporuča se, jer tako osigurava dosljednost u ponovnom korištenju (svi koraci izgradnje kontejnera su sadržani u Apptainer receptu koji je vidljiv u kontejneru).

Apptainer recept se sastoji od dva glavna dijela:

...

Na Supeku je dostupna verzija v1.1.6 aplikacije Apptainer.

Apptainer i kontejneri

Tipični workflow za izgradnju kontejnera je sljedeći:

  1. pronalaženje uputa za instalaciju tražene aplikacije
  2. istraživanje odgovarajućeg operativnog sustava
  3. kreiranje osnovnog kontejnera i njegova interaktivna nadogradnja
  4. prebacivanje kontejnera u image ili izvršni oblik
  5. dopremanje i izvršavanje na klasteru

Prva četiri koraka mogu se u potpunosti vršiti na korisničkom računalu, dok se posljednji vrši na Supeku gdje su dostupni značajniji resursi.

Napomena: Primjeri ispod se temelje na službenom predlošku, napravljenom u operativnom sustavu Ubuntu Focal Fossa (v20.04 LTS)

Image Added

Slika 2: Workflow za izgradnju i korištenje kontejnera. Slika je preuzeta

sa stranice Singularitya; preteče Apptaineru koja funkcionira

na identičan način.

Izgradnja kontejnera - build

build je najbitnija komanda Apptainera kojom se kontejneri mogu izgraditi u obliku:

  • image - slika ili oblik koji podržava samo čitanje, namijenjen finalnoj verziji kontejnera
  • sandbox - direktorij ili oblik koji podržava i pisanje, namijenjen razvoju kontejnera

Primjerice, ako želimo direktno izgraditi kontejner s operativnim sustavom ubuntu v20.04 (popularnim OS-om koji pruža veliki broj već prevedenih knjižnica kroz svoj upravitelj knjižnicama apt) osnovnu radnu verziju možemo izgraditi na sljedeći način:

Code Block
languagebash
# izgradnja kontejnera
[korisnik@kompjuter:~] $ apptainer build ubuntu_20.04.sif docker://ubuntu:20.04
...
INFO: Creating SIF file

# sadržaj trenutnog direktorija
[korisnik@kompjuter:~] $ ls -lrt
total 27100
-rwxr-xr-x 1 korisnik korisnik 27746304 svi  23 08:47 ubuntu_20.04.sif

Iako je ovaj image ograničene koristi (jer ubuntu sam po sebi obično ne sadrži aplikacije koje su nam potrebne), ovom komandom se mogu dohvatiti već pripremljeni recepti za koje postoje posvećeni repozitoriji, i koji mogu biti osnova za daljnju izgradnju kontejnera.

Ako želimo u gore naveden kontejner instalirati dodatne knjižnice, možemo to učiniti na dva načina:

  1. interaktivnom izgradnjom korištenjem verzije sandbox
  2. izgradnjom slike korištenjem definicijske datoteke .def

Nadogradnja kontejnera - shell --writable

U prvom slučaju, pri izgradnji kontejnera moramo navesti opciju build --sandbox koja će generirati kontejner u obliku direktorija ubuntu_20.04:

Code Block
languagebash
# izgradnja sandbox verzije
[korisnik@kompjuter:~] $ apptainer build --sandbox ubuntu_20.04 docker://ubuntu:20.04
...
INFO:    Creating sandbox directory...
INFO:    Build complete: ubuntu_20.04

# sadržaj trenutnog direktorija
[korisnik@kompjuter:~] $ ls -l
total 27104
drwxr-xr-x 18 korisnik korisnik     4096 svi  23 09:05 ubuntu_20.04
-rwxr-xr-x  1 korisnik korisnik 27746304 svi  23 08:47 ubuntu_20.04.sif

Novonastali sandbox kontejner možemo modificirati korištenjem opcije shell --writable kojom otvaramo ljusku unutar kontejnera sa svim korisničkim knjižnicama koje doprema.

Ispod se nalazi primjer osvježavanja instalacijskih repozitorija apt i instalacije jednostavne aplikacije cowsay:

Code Block
languagebash
# otvaranje sjednice u kontejneru
[korisnik@kompjuter] $ sudo apptainer shell ubuntu_20.04
INFO:    /etc/singularity/ exists; cleanup by system administrator is not complete (see https://apptainer.org/docs/admin/latest/singularity_migration.html)
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container

# osvježavanje repozitorija
Apptainer> apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
...
All packages are up to date.

# instalacija cowsay
Apptainer> apt install cowsay -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libgdbm-compat4 libgdbm6 libperl5.30 libtext-charwidth-perl netbase perl perl-modules-5.30
...

# pokretanje aplikacije cowsay
Apptainer> /usr/games/cowsay Moo
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_ADDRESS = "hr_HR.UTF-8",
	LC_NAME = "hr_HR.UTF-8",
	LC_MONETARY = "hr_HR.UTF-8",
	LC_PAPER = "hr_HR.UTF-8",
	LC_IDENTIFICATION = "hr_HR.UTF-8",
	LC_TELEPHONE = "hr_HR.UTF-8",
	LC_MEASUREMENT = "hr_HR.UTF-8",
	LC_TIME = "hr_HR.UTF-8",
	LC_NUMERIC = "en_US.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
 _____
< Moo >
 -----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


Jednom kada smo zadovoljni sa sandbox verzijom koja je potrebna za izvršavanje naših aplikacija, možemo ju prevesti u image korištenjem naredbe build:

Code Block
languagebash
# prebacivanje sandbox verzije u image
[korisnik@kompjuter:~] $ sudo apptainer build ubuntu_20.04.sif ubuntu_20.04/
...
INFO:    Creating SIF file...
INFO:    Build complete: ubuntu_20.04.sif

# sadržaj trenutnog direktorija
[korisnik@kompjuter:~] $ ls -l
total 154496
drwxr-xr-x 18 korisnik korisnik      4096 svi  23 09:51 ubuntu_20.04
-rwxr-xr-x  1 korisnik korisnik 158195712 svi  23 09:58 ubuntu_20.04.sif

Novija image verzija sada će (osim osnovnog operativnog sustava ubuntu v20.04) sadržavati i aplikaciju cowsay.

Izgradnja receptom - .def

Drugi način (osim gore opisane interaktivne nadogradnje) je korištenjem recepta ili definition datoteka .def koje u sebi sadrže upute za izgradnju kontejnera.

Ovaj način je najpoželjniji jer osigurava dosljednu izgradnju imagea koja se može postepeno i dosljedno poboljšavati, no na uštrb brzine razvoja jer svakom se modifikacijom image mora ponovno izgraditi.

.def datoteke u sebi sadrže:

  • zaglavlje ili header - definicija osnovnog operativnog sustava
  • poglavlja ili sections - dijelovi koji definiraju razne dijelove izgradnje i korisnički okoliš koji je dostupan u kontejneru

U zaglavlju se definira bazni operacijski sustav koji će se koristiti u kontejneru. Osnovne ključne riječi su:

  • Bootstrap - referencira tip baze koji će se koristiti
  • From -  ime kontejnera (ili referenca na layere u slučaju Dockera) koji će se koristiti

Nakon zaglavlja , izgradnja i namještanje okoline kontejnera zapisuje se u poglavljima. Neka od najvažnijih su:

  • %files - dostavljanje datoteka u kontejner
  • %post - izvršavanje komandi unutar kontejnera tijekom izgradnje
  • %environment - definicija varijabli okoline unutar kontejnera tijekom izvršavanja (nakon njegove izgradnje)
  • %runscript - zadane naredbe koje se izvršavaju korištenjem apptainer run ... ili direktnim izvršavanjem kontejnera

Primjer recepta sa službenih stranica napisan ispod u sebi će:

  • izgraditi osnovni operativni sustav Ubuntu v20.04
  • osvježiti apt repozitorije i instalirati aplikaciju cowsay
  • uključiti izvršnu datotku cowsayiz /usr/games u korisničku okolinu
  • definirati izvršnu naredbu date | cowsay kao zadanu
  • definirati autora kontejnera


Code Block
languagebash
BootStrap: library
From: ubuntu:20.04

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

%environment
	export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    date | cowsay

%labels
    Author GodloveD


Navedeni recept (npr. ubuntu_20.04.def ) možemo izgraditi u image naredbom build:

Code Block
languagebash
# izgradnja imagea korištenjem naredbe build
[korisnik@kompjuter:~] $ apptainer build ubuntu_20.04.sif ubuntu_20.04.def
...
INFO:    Creating SIF file...
INFO:    Build complete: ubuntu_20.04.sif

# ispis detalja datoteke
[korisnik@kompjuter:~] $ ls -l ubuntu_20.04.sif
-rwxr-xr-x 1 marko marko 83701760 svi  25 10:41 ubuntu_20.04.sif


I koristiti kao i svaku drugu aplikaciju:

Code Block
languagebash
# direktno izvršavanje kontejnera
[korisnik@kompjuter:~] $ ./ubuntu_20.04.sif
_______________________________
< Mon May 29 09:59:27 CEST 2023 >
 -------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

...

Zaglavlje je obvezan dio recepta, dok su sekcije opcionalne. U zaglavlju se definira bazni OS koji se želi instalirati u kontejneru, a u sekcijama se navode svi ostali koraci koje želimo iskoristiti prilikom izgradnje kontejnera (npr. kopirati datoteke, instalirati softver, kreirati varijable okoline i sl.)

Image Removed

Slika 2:  Workflow za izradu i korištenje kontejnera. Slika je preuzeta

sa stranice Singularitya; preteča Apptaineru koja funkcionira

na identičan način.

Apptainer recepti

Header

U headeru se definira bazni operacijski sustav koji će se koristiti u kontejneru. Osnovne ključne riječi su:

  • Bootstrap - referencira tip baze koji će se koristiti
  • From -  ime kontejnera (ili referenca na layere u slučaju Dockera) koji će se koristiti

Tip Bootstrap baze može biti na primjer:

Primjer za bazu shub :

Code Block
Bootstrap: shub
From: vsoch/hello-world

Više informacija o Apptainer receptima dostupno je na službenim stranicama.

Sections

Nakon zaglavlja, izgradnja i namještanje okoline kontejnera zapisuje se u poglavljima. Neka od najvažnijh su:

  • %files - dostavljanje datoteka u kontejner
  • %post - izvršavanje komandi unutar kontejnera tijekom izgradnje
  • %environment - definicija varijabli okoline unutar kontejnera tijekom izvršavanja (nakon njegove izgradnje)
  • %runscript - zadane naredbe koje se izvršavaju korištenjem apptainer run ... ili direktnim izvršavanjem kontejnera

Primjer recepta sa službenih stranica napisan ispod u sebi će:

  • izgraditi osnovni operativni sustav Ubuntu v22.04
  • dostaviti datoteku hello_world.txt unutar kontejnera u /my_data/hello_world.txt
  • osvježiti apt repozitorije i instalirati aplikacije cowsay i lolcat
  • uključiti izvršne datotke cowsay i lolcat iz /usr/games u korisničku okolinu
  • definirati izvršnu naredbu date | cowsay | lolcat kao zadanu
  • definirati autora kontejnera
Code Block
languagebash
BootStrap: library
From: ubuntu:22.04

%files
    hello_world.txt /my_data/hello_world.txt

%post
    apt-get -y update
    apt-get -y install cowsay lolcat

%environment
	export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    date | cowsay | lolcat

%labels
    Author GodloveD

Navedeni recept (npr. apptainer.def ) možemo izgraditi u image naredbom build:

Code Block
languagebash
# izgradnja imagea korištenjem naredbe build
[korisnik@kompjuter:~] $ apptainer build apptainer.sif apptainer.def
...
INFO:    Creating SIF file...
INFO:    Build complete: apptainer.sif

# ispis detalja datoteke
[korisnik@kompjuter:~] $ ls -l apptainer.sif
-rwxr-xr-x 1 marko marko 83701760 svi  25 10:41 apptainer.sif

Korištenje javnih repozitorija

Proces izgradnje i nadogradnje kontejnera može se ubrzati korištenjem javnih repozitorija koji sadrže već testirane recepte (što je uostalom i svrha kontejnera) koji se mogu koristiti u receptima ili pri pri izradi recepta (u zagavlju) ili izgradnji sandbox kontejnera.

...