Skip to content

Zgradimo prvi vsebnik

Prvi poskus

Zgradili bomo enostavno različico vsebnika, s katerim smo se zabavali v prejšnjem poglavju. Za osnovo bomo vzeli operacijski sistem Linux Ubuntu, različico , in v vsebnik namestili programček fortune.

$ apptainer build modrec.sif docker://ubuntu
apptainer build modrec.sif docker://ubuntu

Vsebnik zaženimo v interaktivnem načinu

$ apptainer shell modrec.sif
apptainer shell modrec.sif

in poglejmo verzijo operacijskega sistema

Singularity> cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
...
cat /etc/os-release

Če želimo vsebnik spreminjati, moramo imeti skrbniške pravice. Na lastnem računalniku uporabimo ukaz sudo (angl. super user do) ali stikalo --fakeroot, na večuporabniškem sistemu pa stikalo --fakeroot. Seveda nam mora skrbnik pred tem dati dovoljenje za njegovo uporabo. V nadaljevanju bomo uporabljali stikalo --fakeroot. Z dodatnimi pravicami vsebnik spet zaženimo v interaktivnem načinu.

$ sudo apptainer shell modrec.sif         # Uporaba sudo

$ apptainer shell --fakeroot modrec.sif   # Uporaba stikala --fakeroot
sudo apptainer shell modrec.sif

apptainer shell --fakeroot modrec.sif

Če poskusimo v vsebniku posodobiti namestitveni program apt z ukazom apt update, dobimo opozorilo, da gre za datotečni sistem, namenjen samo za branje (angl. Read-only file system). Z ukazom exit se vrnemo na gostitelja.

Nespremenljivi in spremenljivi vsebniki

Ogrodje Apptainer pozna nespremenljive (angl. immutable) in spremenljive (angl. mutable) vsebnike.

  • Nespremenljive vsebnike spoznamo po datoteki s končnico sif. Običajno delamo z njimi.
  • Spremenljive vsebnike potrebujemo predvsem med razvojem (gradnjo). Spremenljiv vsebnik zahtevamo s stikalom --sandbox. Tak vsebnik je na gostitelju predstavljen z mapo, v kateri so shranjene vse datoteke vsebnika. Po zaključeni gradnji spremenljiv vsebnik pretvorimo v nespremenljivega.

Na lokalnem računalniku nespremenljive vsebnike ustvarimo z ukazoma apptainer pull ali apptainer build. Za pripravo spremenljivega vsebnika moramo obvezno uporabiti ukaz apptainer build.

Drugi poskus

Zdaj imamo dovolj znanja, da bi morale stvari teči gladko. Spremenljiv vsebnik bomo označevali s končnico sb (angl. SandBox).

$ apptainer build --sandbox modrec.sb docker://ubuntu
INFO:    Starting build...
...
INFO:    Creating sandbox directory...
INFO:    Build complete: modrec.sb

$ ls modrec.sb
bin   dev          etc   lib    lib64   media  opt   root  sbin         srv  tmp  var
boot  environment  home  lib32  libx32  mnt    proc  run   singularity  sys  usr
apptainer build --sandbox modrec.sb docker://ubuntu
ls modrec.sb

Ukaz ls -l modrec.sb nam razkrije, da je spremenljiv vsebnik dejansko mapa, v kateri so shranjene vse datoteke vsebnika.

Vstopimo v vsebnik in še enkrat namestimo program fortune. Pazimo, da vstopimo kot skrbnik in da vsebnik pripravimo za pisanje.

$ apptainer shell --fakeroot --writable modrec.sb

Apptainer> apt update
...
1 package can be upgraded. Run 'apt list --upgradable' to see it.

Apptainer> apt install fortune
...
The following NEW packages will be installed:
fortune-mod fortunes-min librecode0
0 upgraded, 3 newly installed, 0 to remove and 1 not upgraded.
Need to get 762 kB of archives.
After this operation, 2154 kB of additional disk space will be used.
...

Apptainer> /usr/games/fortune
It's always darkest just before it gets pitch black.

Apptainer> exit

$ apptainer exec modrec.sb /usr/games/fortune
Never eat more than you can lift.

$ apptainer run modrec.sb

Singularity> exit
apptainer shell --fakeroot --writable modrec.sb

apt update

apt install fortune

/usr/games/fortune

apptainer exec modrec.sb /usr/games/fortune

apptainer run modrec.sb

exit

Veliko bolje. Ukaz apptainer exec deluje, spremembe smo tokrat uspešno shranili. Le ukaz apptainer run še ne vrne modre misli. V osnovni mapi vsebnika najdemo datoteko singularity. Gre za skripto, ki se izvede ob zagonu vsebnika. Za naše potrebo v skripti singularity potrebujemo zgolj dve vrstici.

1
2
#!/bin/sh
exec /usr/games/fortune "$@"

Vrstici lahko zapišemo v datoteko singularity s pomočjo poljubnega urejevalnika besedil (vi, nano) ali pa ju kar izpišemo na standardni izhod in preusmerimo v datoteko singularity.

$ (echo '#!/bin/sh'; echo 'exec /usr/games/fortune "$@"') > modrec.sb/singularity    
$ cat modrec.sb/singularity
#!/bin/sh
exec /usr/games/fortune "$@"

$ apptainer run modrec.sb
There has been an alarming increase in the number of things you know nothing about.
(echo '#!/bin/sh'; echo 'exec /usr/games/fortune "$@"') > modrec.sb/singularity    
cat modrec.sb/singularity

apptainer run modrec.sb

Super! Zdaj, ko smo s spremenljivim vsebnikom zadovoljni, ga pretvorimo v nespremenljivega. Seveda lahko prepišemo neuspešen prvi poskus. Tokrat bomo nespremenljiv vsebnik modrec.sif zgradili kar iz spremenljivega vsebnika modrec.sb.

$ apptainer build modrec.sif modrec.sb
Build target 'modrec.sif' already exists and will be deleted during the build process. 
Do you want to continue? [N/y]y
INFO:    Starting build...
INFO:    Creating SIF file...
INFO:    Build complete: modrec.sif

$ ./modrec.sif
Computers are not intelligent. They only think they are.
apptainer build modrec.sif modrec.sb

./modrec.sif

Spremenljivega vsebnika modrec.sb ne bomo več potrebovali. Če želimo, ga lahko z ukazom rm -rf modrec.sb pobrišemo.

Preveri svoje znanje

Vaja

Vaja 02