Skoči na vsebino

Recepti za vsebnike

V prejšnjih poglavjih smo vsebnike gradili interaktivno. Tak pristop ni najboljši, saj se nam hitro zgodi, da pozabimo na kakšen korak, zaradi katerega novi vsebnik ne bo pravilno deloval. Pravilnejši pristop je, da vsebnike gradimo iz receptov. Pri pripravi recepta pa si seveda lahko pomagamo z interaktivnim pristopom.

Ko za gradnjo vsebnika pripravimo recept (angl. recipe / definition file / def file), zagotovimo, da bo vsakdo lahko vsebnik zgradil na enak način kot mi.

Recept je sestavljen iz dveh delov:

  • Iz glave, v kateri navedemo operacijski sistem, na katerem želimo vsebnik zgraditi (distribucijo in verzijo).
  • Iz opcijskih razdelkov, v katere pišemo navodila za gradnjo in zaganjanje vsebnika.

Poglejmo si recept za gradnjo vsebnika modrec.def.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# GLAVA
Bootstrap: library
From: alpine:3

# RAZDELKI
%setup
    # ukaz, ki se bo izvedel na gostitelju po namestitvi OS v vsebniku
    (echo "======"; echo "modrec"; echo "======") > info.txt

%files
    # datoteke, ki jih iz gostitelja prenesemo v vsebnik
    ./info.txt /info/

%environment
    # nastavitev spremenljivk okolja ob zagonu vsebnika
    export LC_ALL=C    

%post
    # namestitveni koraki v vsebniku
    export LC_ALL=C    

    apk update
    apk add fortune

%runscript
    # skripta, ki se izvede ob zagonu vsebnika
    fortune "$@"

%test
    # testna skripta
    cat /info/info.txt
    fortune
    test -x /usr/bin/fortune

%labels
    # poljubne oznake vsebnika kot pari oznaka - vrednost
    Author      davor (dot) sluga (at) fri (dot) uni (dash) lj (dot) si
    Container   modrec
    Version     1.0
    Description Workshop advanced supercomputing (Superračunalištvo bolj zares)

%help
    # navodila za uporabo vsebnika
    Vsebnik vključuje progam fortune za izpisovanje globokih misli
    Uporaba:
        singularity run modrec.sif
        ./modrec.sif
        singularity exec modrec.sif fortune

Glava

V glavo smo napisali Bootstrap: library in From: apline:3, s čimer smo zahtevali gradnjo vsebnika iz Linux distribucije alpine, verzije 3, ki se nahaja v repozitoriju Singularity Cloud Library.

Nekaj priljubljenih nastavitev za Bootstrap:

  • library: če izhajamo iz vsebnika v repozitoriju Singularity Cloud Library,
  • docker: če izhajamo iz vsebnika v repozitoriju dockerhub,
  • localimage: če vsebnik gradimo iz že obstoječe lokalne slike vsebnika.

Za nastavitev From vpišemo v prvih dveh primerih oznako vsebnika v repozitoriju, v zadnjem primeru pa ime vsebnika na lokalnem računalniku.

Razdelki

%setup

V razdelek %setup pišemo ukaze, ki jih bo ogrodje Singularity izvedlo na gostitelju potem, ko bo nameščen operacijski sistem v vsebniku. Ker se ti ukazi izvajajo s skrbniškimi pravicami, se jim je bolje izogniti. V našem primeru za demonstracijo na gostitelju ustvarimo datoteko info.txt s spodnjo vsebino.

1
2
3
======
modrec
======

%files

V razdelku %files navedemo datoteke, ki jih želimo iz gostitelja prenesti v vsebnik. Podatke za vsako datoteko pišemo v svojo vrstico. Najprej navedemo ime datoteke na gostitelju, nato pa pot oziroma ime datoteke v vsebniku. Kadar navedemo samo ciljno mapo datoteke v vsebniku, oznako mape zaključimo z znakom /.

%environment

V razdelek %environment navedemo, kako naj se ob zagonu vsebnika nastavijo okoljske spremenljivke. Z nastavitvijo spremenljivke LC_ALL=C povozimo nastavljeno lokalizacijo z enostavno lokalizacijo C (angl. Computers) z ASCII kodno tabelo in ameriško angleščino. Ukazi v razdelku se izvedejo samo ob zagonu vsebnika. V primeru, da potrebujemo ustrezno nastavitev okoljskih spremenljivk tudi pri nameščanju programov v vsebniku, jih dodamo v razdelek %post.

%post

Za gradnjo vsebnika je razdelek %post najpomembnejši. V tem delu nameščamo programsko opremo in s spleta prenašamo datoteke. Med nameščanjem programi velikokrat nastavijo tudi okoljske spremenljivke. Te nastavitve se bodo ob zagonu vsebnika izgubile, če jih posebej ne vpišemo v razdelek %environment. V našem primeru nastavimo lokalizacijo, osvežimo repozitorije namestitvenega programa apk in namestimo program fortune.

%runscript

Ukazi, napisani v tem razdelku, se bodo izvedli ob zagonu vsebnika z ukazom apptainer run. Ogrodje Singularity poskrbi, da argumente, ki sledijo imenu vsebnika, prenese v razdelek. V našem primeru zaženemo program fortune z vsemi dodatnimi argumenti.

%test

V razdelek %test napišemo ukaze, s katerimi preverimo pravilnost delovanja vsebnika. Ukazi v razdelku se zaženejo po končani gradnji vsebnika ali ob klicu ukaza apptainer test. Naša testna skripta z ukazom cat izpiše vsebino datoteke /info/info.txt, s programom fortune eno globoko misel in na koncu preveri, če obstaja izvršljiva datoteka fortune.

$ apptainer test modrec.sif
======
modrec
======
If you can't learn to do it well, learn to enjoy doing it badly.
apptainer test modrec.sif

%labels

Prav je, da vsebnik opremimo z osnovnimi podatki. Navedemo jih v razdelku %labels v obliki oznaka - vrednost. Osnovne podatke o vsebniku izpišemo z ukazom apptainer inspect.

$ apptainer inspect modrec.sif
Author: info@sling.si
Container: modrec (angl. an oracle)
Version: 1.0
Workshop: Advanced supercomputing
org.label-schema.build-date: Saturday_1_May_2021_23:56:3_CEST
org.label-schema.schema-version: 1.0
org.label-schema.usage: /.singularity.d/runscript.help
org.label-schema.usage.singularity.deffile.bootstrap: library
org.label-schema.usage.singularity.deffile.from: alpine:3
org.label-schema.usage.singularity.runscript.help: /.singularity.d/runscript.help
org.label-schema.usage.singularity.version: 3.6.3-10.cmi.0.el8
apptainer inspect modrec.sif

%help

V razdelek %help vpišemo navodila za uporabo vsebnika. Uporabnik jih izpiše z ukazom apptainer run-help.

$ apptainer run-help modrec.sif
    # navodila za uporabo vsebnika
    Vsebnik vključuje progamček fortune za izpisovanje modrosti
    Uporaba:
        apptainer run modrec.sif
        ./modrec.sif
        apptainer exec modrec.sif fortune
apptainer run-help modrec.sif

Gradnja vsebnika

Vsebnik iz recepta zgradimo s pomočjo ukaza build s skrbniškimi pravicami.

$ apptainer build --fakeroot modrec.sif modrec.def
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...
apptainer build --fakeroot modrec.sif modrec.def

Pomoč

Materiali za gradnjo vsebnika so na voljo v repozitoriju.

Povezovanje z datotečnim sistemom gostitelja

Ogrodje Singularity, za razliko od mnogih drugih ogrodij za gradnjo vsebnikov, samo poskrbi, da v vsebniku vidimo datotečni sistem gostitelja. Vsebnik privzeto vidi mape: $HOME (glavna mapa uporabnika), $PWD (trenutna mapa) , /tmp , /proc , /sys in /dev. Na superračunalniških gručah je dodanih še nekaj map, ki jih potrebuje Slurm. Mape, katerih vsebino bi še radi videli v vsebniku, povežemo z vsebnikom ob klicu ukaza apptainer exec ali apptainer run, tako da navedemo stikalo --bind z argumentom mapa-gostitelja:mapa-vsebnika. Če želimo povezati več map, pare mapa-gostitelja:mapa-vsebnika ločimo z vejicami.

Nove modrosti za program fortune

Program fortune izpisuje modrosti, ki jih najde v mapi /usr/share/fortune. Ob klicu program naključno izbere modrost iz ene od datotek. Kadar ob klicu programa fortune dodamo argument z imenom datoteke z modrostmi, bo izbral modrost iz te datoteke.

Program lahko izpisuje tudi naše modrosti. Pripraviti moramo dve datoteki: besedilno datoteko brez končnice, v kateri so modrosti ločene z znakom %, in za hitrejši dostop do modrosti še datoteko s končnico dat. Slednjo ustvarimo iz besedilne datoteke z ukazom strfile, ki ga najdemo v našem vsebniku. Podrobnosti. Na spletni strani https://www.verzi-vici.com/ najdemo množico pregovorov, ki jih shranimo v datoteki pregovori in pregovori.dat. Datoteki prenesemo v mapo ./modrosti, ki jo ustvarimo v mapi z vsebnikom z ukazom mkdir modrosti.

$ apptainer run modrec.sif zippy
We have DIFFERENT amounts of HAIR --

$ apptainer run modrec.sif startrek
Without freedom of choice there is no creativity.
            -- Kirk, "The return of the Archons", stardate 3157.4

$ apptainer run modrec.sif pregovori
/usr/share/fortune/pregovori: No such file or directory
apptainer run modrec.sif zippy
apptainer run modrec.sif startrek
apptainer run modrec.sif pregovori

Program fortune ne najde datotek s pregovori, zato izpiše napako. Lahko bi na novo zgradili vsebnik in obe datoteki shranili v mapo /usr/share/fortune. Druga možnost je, da mapo ./modrosti s pregovori povežemo z mapo /usr/share/fortune v vsebniku.

$ apptainer run --bind ./modrosti:/usr/share/fortune modrec.sif pregovori
Sreča je zaveznica pogumnih.

$ apptainer run --bind ./modrosti:/usr/share/fortune modrec.sif startrek
/usr/share/fortune/startrek: No such file or directory
apptainer run modrec.sif zippy
apptainer run modrec.sif startrek
apptainer run modrec.sif pregovori

Zdaj je ogrodje mapo /usr/share/fortune/ v vsebniku zamenjalo z mapo ./modrosti na gostitelju. Ker so v njej samo pregovori, program fortune ne more več izpisovati angleških modrosti.

Dobre prakse pri gradnji vsebnikov

  1. Programske pakete, programe, podatkovne datoteke in podobno nameščamo v mape operacijskega sistema in ne v mape, kot so na primer /home, /tmp.

  2. Vsebnik vedno ustrezno dokumentiramo. Uporabniki imajo radi vsebnike, ki jih znajo hitro uporabljati. Pomoč za uporabo lahko vključimo v %runscript ali %help. V vsebnik vključimo kakšen enostaven testni primer.

  3. Poskrbimo za pravilne nastavitve pravic dostopa do datotek. Lastnik datotek v vsebniku mora biti sistemski račun.

  4. Poskrbimo, da datoteke z občutljivo vsebino, na primer /etc/passwd, /etc/group, /etc/shadow ne vsebujejo gesel.

  5. Produkcijske vsebnike vedno gradimo iz receptov in tako zagotovimo ponovljivost gradnje in delovanja.

Preveri svoje znanje

Vaja

Vaja 03