Skip to Content
Building OsSpouštěcí skripty

Spouštěcí skripty

os.startup_scripts vytváří omezenou jednorázovou práci systemd pro výsledný obraz. Každá položka deklaruje shell příkaz, požadované balíčky, uživatele pro spuštění a jednotku pro pořadí.

Spouštěcí skripty jsou kód s oprávněním root, pokud run_as nestanoví jinak. Projdou stejnou kontrolou jako jakýkoli instalač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" } ] } }

Pole jsou description a command, ne starší pole script. run_as a after také používají snake_case. after je jeden řetězec jednotky systemd, ne pole.

Schéma přijme nejvýše 32 položek a omezenou velikost příkazu. Validace odmítne prázdné příkazy a bajty NUL, ale nečiní obsah shellu bezpečným ani idempotentním.

Návrh pro opakování a částečné selhání

Boot může být přerušen poté, co už došlo k některým vedlejším efektům. Pište skripty tak, aby další spuštění buď bezpečně dokončilo práci, nebo skončilo s jasným stavem, který lze zkontrolovat.

Dobré vzory zahrnují:

  • zápis do dočasného souboru, ověření a atomické přejmenování;
  • kontrolu, zda uživatelé, adresáře nebo položky konfigurace existují;
  • použití install pro explicitního vlastníka a režim;
  • použití set -Eeuo pipefail a záměrné zacházení s očekávanými nenulovými výsledky;
  • omezené síťové timeouty a konečný počet opakování; a
  • zápis značky připravenosti až po úspěchu všech požadovaných kroků.

Nespoléhejte na sleep jako kontrolu připravenosti. Ověřte skutečnou závislost.

Externí stahování

Vyhněte se curl ... | sh. Pokud první boot musí stáhnout artefakt:

  1. použijte HTTPS s ověřením certifikátu;
  2. připevněte očekávaný artefakt nebo verzi zdroje;
  3. před spuštěním ověřte kryptografický digest nebo schválený podpis;
  4. nastavte timeouty pro připojení a celkový čas;
  5. při selhání ověření ukončete s chybou; a
  6. nezapisujte do logu přihlašovací údaje ani podepsané URL.

Pro skutečně offline nebo reprodukovatelné chování vložte zkontrolovaný obsah do obrazu nebo schváleného repozitáře balíčků místo stahování při prvním bootu.

Tajemství

Nikdy nevkládejte do receptu, příkazu, URL ani generované značky přihlašovací údaje v plaintextu. JSON receptu a build logy se uchovávají jako důkaz a mohou být viditelné operátorům. Použijte schválený mechanismus registrace nebo doručení tajemství v době nasazení a omezte výsledný credential na cíl.

Identita spuštění

Upřednostněte neprivilegovaný servisní účet. Pokud je root nutný, zmenšete příkaz na nejmenší privilegovaný krok a nastavte explicitní vlastnictví souborů. Ověřte, že run_as pojmenovává účet vytvořený před startem jednotky.

Ověření

Testujte výsledky, nejen 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 také druhý boot, nedostupnou závislost a obnovu po přerušeném prvním běhu. Při selhání prohlédněte systemctl status a journal jednotky.