Skoči na vsebino

Zgradimo prvi vsebnik

Prvi poskus

Zgradili bomo enostavno različico vsebnika, s katerim smo se zabavali v prejšnjem poglavju. Za osnovo bomo vzeli linux alpine, minimalistično različico operacijska sistema Linux, in v vsebnik namestili programček fortune.

$ singularity build modrec.sif library://library/default/alpine:3
singularity build modrec.sif library://library/default/alpine:3

Vsebnik zaženimo v interaktivnem načinu

$ singularity shell modrec.sif
singularity shell modrec.sif

in poglejmo verzijo operacijskega sistema

Singularity> cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.11.5
PRETTY_NAME="Alpine Linux v3.11"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
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 singularity shell modrec.sif         # Uporaba sudo

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

singularity shell --fakeroot modrec.sif

Če poskusimo v vsebniku posodobiti namestitveni program apk (angl. Alipne linux PacKage manager) z ukazom apk 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 in dodamo stikalo --writable.

$ singularity shell --fakeroot --writable modrec.sif
singularity shell --fakeroot --writable modrec.sif

Zdaj smo pri nameščanju uspešnejši.

Singularity> apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
v3.11.11-18-g5d56e5dd5e [http://dl-cdn.alpinelinux.org/alpine/v3.11/main]
v3.11.11-4-g5468cf6c7f [http://dl-cdn.alpinelinux.org/alpine/v3.11/community]
OK: 11282 distinct packages available

Singularity> apk add fortune
(1/2) Installing libbsd (0.10.0-r0)
(2/2) Installing fortune (0.1-r1)
Executing busybox-1.31.1-r9.trigger
OK: 9 MiB in 16 packages

fortune
Jenkinson's Law: It won't work.
apk update

apk add fortune

fortune

Vrnimo se na gostitelja in zaženimo program v vsebniku.

$ singularity exec modrec.sif fortune
FATAL:   "fortune": executable file not found in $PATH

$ singularity shell modrec.sif
Singularity> fortune
/bin/sh: fortune: not found
singularity exec modrec.sif fortune

Opazimo, da programa fortune ni v vsebniku.

Ko smo s stikalom --writable zahtevali, da v vsebnik lahko pišemo, je ogrodje Singularity našemu vsebniku dodalo še eno plast, v katero je zapisovalo spremembe v datotečnem sistemu vsebnika, osnovni vsebnik pa je pustilo nespremenjen. Ko smo vsebnik zapustili, je ogrodje začasno plast zbrisalo. Morebitne spremembe, ki bi jih med delom v vsebniku naredili na datotečnem sistemu gostitelja, bi se seveda ohranile.

Nespremenljivi in spremenljivi vsebniki

Ogrodje Singularity 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 singualarity pull ali singularity build. Za pripravo spremenljivega vsebnika moramo obvezno uporabiti ukaz singularity 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).

$ singularity build --sandbox modrec.sb library://library/default/alpine:3
INFO:    Starting build...
...
INFO:    Creating sandbox directory...
INFO:    Build complete: modrec.sb

$ ls modrec.sb
bin  dev  environment  etc  home  lib  media  mnt  opt  proc  root  run  sbin  
singularity  srv  sys  tmp  usr  var
singularity build --sandbox modrec.sb library://library/default/alpine:3
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.

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

Singularity> apk update
...
OK: 11282 distinct packages available

Singularity> apk add fortune
...
OK: 9 MiB in 16 packages

Singularity> fortune
It's always darkest just before it gets pitch black.

Singularity> exit

$ singularity exec modrec.sb fortune
Never eat more than you can lift.

$ singularity run modrec.sb

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

apk update

apk add fortune

fortune

singularity exec modrec.sb fortune

singularity run modrec.sb

exit

Veliko bolje. Ukaz singularity exec deluje, spremembe smo tokrat uspešno shranili. Le ukaz singularity 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 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 fortune "$@"') > modrec.sb/singularity    
$ cat modrec.sb/singularity
#!/bin/sh
exec fortune "$@"

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

singularity 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.

$ singularity build --fakeroot 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.
singularity build --fakeroot 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