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