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
49
50
# GLAVA
Bootstrap: docker
From: ubuntu:latest

# 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    

    apt update -y
    apt install -y fortune
    ln -s /usr/games/fortune /usr/bin/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 Containers on HPC (Vsebniki na superracunalnikih)

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

Glava

V glavo smo napisali Bootstrap: docker in From: ubuntu:latest, s čimer smo zahtevali gradnjo vsebnika iz Linux distribucije ubuntu, najnovejšo verzijo, ki se nahaja v repozitoriju Docker Hub.

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 apt 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: davor (dot) sluga (at) fri (dot) uni (dash) lj (dot) si
Container: modrec
Description: Workshop Containers on HPC (Vsebniki na superracunalnikih)
Version: 1.0
org.label-schema.build-arch: amd64
org.label-schema.build-date: Tuesday_16_April_2024_15:6:4_CEST
org.label-schema.schema-version: 1.0
org.label-schema.usage: /.singularity.d/runscript.help
org.label-schema.usage.apptainer.runscript.help: /.singularity.d/runscript.help
org.label-schema.usage.apptainer.version: 1.3.0-1.el8
org.label-schema.usage.singularity.deffile.bootstrap: docker
org.label-schema.usage.singularity.deffile.from: ubuntu:latest
org.opencontainers.image.ref.name: ubuntu
org.opencontainers.image.version: 22.04
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. Recept po katerem je bil zgrajen vsebnik lahko pridobimo iz vsebnika s pomočjo ukaza apptainer inspect -d.

$ 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/games/fortunes. 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 literature
In the space of one hundred and seventy-six years the Mississippi has
shortened itself two hundred and forty-two miles.  Therefore ... in the Old
Silurian Period the Mississippi River was upward of one million three hundred
thousand miles long ... seven hundred and forty-two years from now the
Mississippi will be only a mile and three-quarters long.  ... There is
something fascinating about science.  One gets such wholesome returns of
conjecture out of such a trifling investment of fact.
            -- Mark Twain

$ apptainer run modrec.sif riddles
Q:      Why do the police always travel in threes?
A:      One to do the reading, one to do the writing, and the other keeps
        an eye on the two intellectuals.

$ apptainer run modrec.sif pregovori
No fortunes found
apptainer run modrec.sif literature
apptainer run modrec.sif riddles
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/games/fortunes. Druga možnost je, da mapo ./modrosti s pregovori povežemo z mapo /usr/share/games/fortunes v vsebniku.

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

$ apptainer run --bind ./modrosti:/usr/share/games/fortunes modrec.sif riddles
No fortunes found
apptainer run modrec.sif pregovori
apptainer run modrec.sif riddles

Zdaj je ogrodje mapo /usr/share/games/fortunes/ 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