Spúšťacie skripty
os.startup_scripts vytvára obmedzenú jednorazovú prácu systemd pre výsledný obraz. Každá položka deklaruje shell príkaz, požadované balíčky, používateľa pre spustenie a jednotku pre poradie.
Spúšťacie skripty sú kód s oprávnením root, pokiaľ run_as neurčí inak. Prejdú rovnakou kontrolou ako akýkoľvek inštalačný skript.
Kanonický tvar
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local readiness marker after networking is available.",
"command": "set -Eeuo pipefail\ninstall -d -m 0755 /var/lib/example\nprintf '%s\\n' ready > /var/lib/example/build-ready",
"packages": [],
"run_as": "root",
"after": "network-online.target"
}
]
}
}Polia sú description a command, nie staršie pole script. run_as a after tiež používajú snake_case. after je jeden reťazec jednotky systemd, nie pole.
Schéma prijme najviac 32 položiek a obmedzenú veľkosť príkazu. Validácia odmietne prázdne príkazy a bajty NUL, ale nečiní obsah shellu bezpečným ani idempotentným.
Návrh pre opakovanie a čiastočné zlyhanie
Boot môže byť prerušený potom, čo už nastali niektoré vedľajšie efekty. Píšte skripty tak, aby ďalšie spustenie buď bezpečne dokončilo prácu, alebo skončilo s jasným stavom, ktorý sa dá skontrolovať.
Dobré vzory zahŕňajú:
- zápis do dočasného súboru, overenie a atomické premenovanie;
- kontrolu, či používatelia, adresáre alebo položky konfigurácie už existujú;
- použitie
installpre explicitného vlastníka a režim; - použitie
set -Eeuo pipefaila zámerné spracovanie očakávaných nenulových výsledkov; - obmedzené sieťové timeouty a konečný počet opakovaní; a
- zápis značky pripravenosti až po úspechu všetkých požadovaných krokov.
Nespoliehajte sa na sleep ako kontrolu pripravenosti. Overte skutočnú závislosť.
Externé sťahovanie
Vyhnite sa curl ... | sh. Ak prvý boot musí stiahnuť artefakt:
- použite HTTPS s overením certifikátu;
- pripnite očakávaný artefakt alebo verziu zdroja;
- pred spustením overte kryptografický digest alebo schválený podpis;
- nastavte timeouty pre pripojenie a celkový čas;
- pri zlyhaní overenia ukončite s chybou; a
- nezapisujte do logu prihlasovacie údaje ani podpísané URL.
Pre skutočne offline alebo reprodukovateľné správanie vložte skontrolovaný obsah do obrazu alebo schváleného repozitára balíčkov namiesto sťahovania pri prvom boote.
Tajomstvá
Nikdy nevkladajte do receptu, príkazu, URL ani generovanej značky prihlasovacie údaje v plaintexte. JSON receptu a build logy sa uchovávajú ako dôkaz a môžu byť viditeľné operátorom. Použite schválený mechanizmus registrácie alebo doručenia tajomstiev v čase nasadenia a obmedzte výsledný credential na cieľ.
Identita spustenia
Uprednostnite neprivilegovaný servisný účet. Ak je root nutný, zmenšite príkaz na najmenší privilegovaný krok a nastavte explicitné vlastníctvo súborov. Overte, že run_as pomenúva účet vytvorený pred štartom jednotky.
Overenie
Testujte výsledky, nielen návratový kód jednotky:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Otestujte aj druhý boot, nedostupnú závislosť a obnovu po prerušenom prvom behu. Pri zlyhaní prezrite systemctl status a journal jednotky.