Skip to Content
Building OsSkripte pri pokretanju

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 install za eksplicitnog vlasnika i način;
  • primjena set -Eeuo pipefail i 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:

  1. koristite HTTPS s provjerom certifikata;
  2. pričvrstite očekivani artefakt ili verziju izvora;
  3. prije izvršenja provjerite kriptografski digest ili odobreni potpis;
  4. postavite timeoute za spajanje i ukupno vrijeme;
  5. ako provjera ne uspije, završite s greškom; i
  6. 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.