Skripte pri pokretanju
os.startup_scripts stvara ograničeni jednokratni systemd posao za nastali image. Svaka stavka deklarira shell naredbu, potrebne pakete, korisnika za izvršenje i jedinicu za redoslijed.
Skripte pri pokretanju su kod s root ovlastima, osim ako run_as ne kaže drugačije. Prolaze isti pregled kao bilo koja instalacijska skripta.
Kanonski oblik
{
"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"
}
]
}
}Polja su description i command, ne zastarjelo polje script. run_as i after također koriste snake_case. after je jedan niz systemd jedinice, ne polje.
Shema prihvaća najviše 32 stavki i ograničenu veličinu naredbe. Validacija odbija prazne naredbe i NUL bajtove, ali ne čini sadržaj shella sigurnim niti idempotentnim.
Dizajn za ponovne pokušaje i djelomični kvar
Boot može biti prekinut nakon što su se neki sporedni učinci već dogodili. Pišite skripte tako da sljedeće pokretanje ili sigurno dovrši posao ili završi s jasnim stanjem koje se može provjeriti.
Dobri obrasci uključuju:
- pisanje u privremenu datoteku, provjera i atomsko preimenovanje;
- provjera postoje li korisnici, direktoriji ili stavke konfiguracije;
- korištenje
installza eksplicitnog vlasnika i način; - primjena
set -Eeuo pipefaili namjerno rukovanje očekivanim nenultim rezultatima; - ograničeni mrežni timeouti i konačan broj ponovnih pokušaja; i
- pisanje oznake spremnosti tek nakon uspjeha svih potrebnih koraka.
Ne oslanjajte se na sleep kao provjeru spremnosti. Provjerite stvarnu ovisnost.
Vanjska preuzimanja
Izbjegavajte curl ... | sh. Ako prvi boot mora preuzeti artefakt:
- koristite HTTPS s provjerom certifikata;
- pričvrstite očekivani artefakt ili verziju izvora;
- prije izvršenja provjerite kriptografski digest ili odobreni potpis;
- postavite timeoute za spajanje i ukupno vrijeme;
- ako provjera ne uspije, završite s greškom; i
- ne zapisujte vjerodajnice ili potpisane URL-ove u dnevnik.
Za stvarno offline ili ponovljivo ponašanje uključite pregledani sadržaj u image ili odobreni repozitorij paketa umjesto preuzimanja pri prvom bootu.
Tajne
Nikada ne ugrađujte vjerodajnice u plaintextu u recept, naredbu, URL ili generiranu oznaku. JSON recepta i build dnevnici čuvaju se kao dokaz i mogu biti vidljivi operatorima. Koristite odobreni mehanizam upisa ili isporuke tajni pri deployu i ograničite nastali credential na cilj.
Identitet izvršenja
Preferirajte neprivilegirani servisni račun. Ako je root potreban, smanjite naredbu na najmanji privilegirani korak i postavite eksplicitno vlasništvo datoteka. Potvrdite da run_as imenuje račun stvoren prije pokretanja jedinice.
Provjera
Testirajte ishode, a ne samo izlazni kod jedinice:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Testirajte i drugi boot, nedostupnu ovisnost i oporavak nakon prekinutog prvog pokretanja. Pri kvaru pregledajte systemctl status i journal jedinice.