Next: , Up: Kontajnery   [Contents][Index]


4.1 Kontajnery Guix

Najľahším spôsobom ako začať je použitie príkazu proc s voľbou --container. See Invoking guix shell in GNU Guix Reference Manual pre popis dostupných volieb.

Nasledovný úryvok kódu spúšťa jednoduchý proces shellu s väčšinou oblastí mien nezdieľaných so systémom. Proces vidí súčasný pracovný priečinok, ale zvyšok súborového systému je mu nedostupný. Toto mimoriadne oddelenie sa môže hodiť keď sa chcete zbaviť všetkých nechcených zásahov premenných prostredia, celosystémovo nainštalovaných knižníc alebo súborov nastavení.

guix shell --container

Je to čisté, holé a vyprahnuté prostredie. Zistíte, že neobsahuje ani GNU coreutils, takže pre prebádanie tejto pustiny musíte použiť vstavané príkazy shellu. Aj z obvykle obrovského priečinka /gnu/store zostal iba tieň.

$ echo /gnu/store/*
/gnu/store/…-gcc-10.3.0-lib
/gnu/store/…-glibc-2.33
/gnu/store/…-bash-static-5.1.8
/gnu/store/…-ncurses-6.2.20210619
/gnu/store/…-bash-5.1.8
/gnu/store/…-profile
/gnu/store/…-readline-8.1.1

V podobnom prostredí sa toho veľa urobiť nedá okrem toho, že ho opustíte. Na to vám poslúži klávesová skratka ^D alebo príkaz exit.

V kontajneri môžete sprístupniť aj iné priečinky. Použite --expose=PRIEČINOK pre podvojné pripojenie daného priečinka ku kontajneru len na čítanie, alebo použite --share=PRIEČINOK, aby sa do daného priečinka dalo aj zapisovať. Pridaním dodatočného parametra za cestou k priečinku môžete ovládať názov priečinka vrámci kontajnera. V nasledovnom príklade mapujeme /etc hostiteľského systému ako /hosť/etc v kontajneri obsahujúcom GNU coreutils.

$ guix shell --container --share=/etc=/hosť/etc coreutils
$ ls /hosť/etc

Tiež je možné zabrániť mapovaniu súčasného pracovného priečinka v kontajneri pomocou voľby --no-cwd. Ďalším dobrým nápadom je vytvorenie vyhradeného priečinka, ktorý kontajneru poslúži ako domovský priečinok, v ktorom sa spustí shell kontajnera.

Na cudzom systéme možno kontajnerové prostredie využiť na preklad programov, ktoré nemožno spojiť so systémovými knižnicami alebo so systémovým vývojovým reťazcom. Obvyklým príkladom je oblasť výskumu, kde používatelia často inštalujú balíky vrámci sedenia R. Mimo kontajnerového prostredia je pravdepodobné, že cudzí vývojový reťazec či nevhodné systémové knižnice budú nájdené ako prvé. Výsledkom sú potom nevyhovujúce binárne súbory, ktoré R nemôže využiť. V kontajneri tento problém zaniká, keďže systémové knižnice a spustiteľné súbory jednoducho nie sú prístupné kvôli nezdieľanej oblasti mien pripojení mount.

Vezmime si zrozumiteľný balíkospis poskytujúci pohodlné vývojové prostredie pre použitie s R:

(specifications->manifest
  (list "r-minimal"

        ;; základné balíky
        "bash-minimal"
        "glibc-locales"
        "nss-certs"

        ;; Všeobecné nástroje príkazového riadka, bez ktorých by bol kontajner pripustý.
        "coreutils"
        "grep"
        "which"
        "wget"
        "sed"

        ;; Nástroje značkovacieho jazyka R
        "pandoc"

        ;; Vývojový reťazec a všeobecné knižnice pre „install.packages“
        "gcc-toolchain@10"
        "gfortran-toolchain"
        "gawk"
        "tar"
        "gzip"
        "unzip"
        "make"
        "cmake"
        "pkg-config"
        "cairo"
        "libxt"
        "openssl"
        "curl"
        "zlib"))

Použime tento balíkospis pre spustenie R v kontajnerovom prostredí. Pre zjednodušenie zdieľame sieťovú oblasť mien net pre prístup k sieťovým rozhraniam hostiteľského systému. Teraz môžeme zostavovať balíky R zo zdrojového kódu obvyklým spôsobom bez obáv o rozpory týkajúce sa ABI alebo o iné ťažkosti.

$ guix shell --container --network --manifest=balikospis.scm -- R

R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid"
Copyright (C) 2022 The R Foundation for Statistical Computing
…
> e <- Sys.getenv("GUIX_ENVIRONMENT")
> Sys.setenv(GIT_SSL_CAINFO=paste0(e, "/etc/ssl/certs/ca-certificates.crt"))
> Sys.setenv(SSL_CERT_FILE=paste0(e, "/etc/ssl/certs/ca-certificates.crt"))
> Sys.setenv(SSL_CERT_DIR=paste0(e, "/etc/ssl/certs"))
> install.packages("Cairo", lib=paste0(getwd()))
…
* installing *source* package 'Cairo' ...
…
* DONE (Cairo)

The downloaded source packages are in
	'/tmp/RtmpCuwdwM/downloaded_packages'
> library("Cairo", lib=getwd())
> # success!

Používanie kontajnerov je zábavné, ale pri viac ako jednom interaktívnom procese sa môžu zdať ťažkopádne. Niektoré úlohy sú oveľa ľahšie zvládnuteľné ak sú založené na skalopevnom základe plného systému Guix a jeho bohatej množine systémových služieb. V ďalšom oddieli si ukážeme ako spustiť plný systém Guix v kontajneri.


Next: Kontajnery systému Guix, Up: Kontajnery   [Contents][Index]