Summary
Add a "SystemInfo" volume source that delivers substrate-generated, per-actor files into an actor's containers, similar to Kubernetes projected volumes / downwardAPI. The volume is declared in spec.volumes with a list of data sources, each of which writes one file at a configurable relative path, and is bind-mounted read-only wherever a container mounts it.
This replaces the hardcoded /run/ate/actor-id identity mount with an explicit and extensible API: templates opt in, choose the mount location and file layout, and future identity material (JWTs, certificates) can be added as new data sources without inventing new mount conventions.
Why a volume, not env vars or baked files
Per-actor identity data must never be part of an actor's checkpointed state. Anything living in checkpointed process memory (env vars) or in the container image is frozen into snapshots: it goes stale across suspend/resume cycles, and when a snapshot seeds a different actor than the one that created it, every actor restored from it observes the same wrong values.
SystemInfo volume contents are instead regenerated by atelet on the host on every Run/Restore — whatever the boot source (cold boot, a shared template snapshot, or the actor's own prior snapshot) — so the mounted files always carry the resumed actor's own, current values. Workloads should read them fresh rather than caching at startup.
Proposed API
spec:
volumes:
- name: system-info
systemInfo:
dataSources:
- actorIdentity:
path: actor-id
containers:
- name: main
image: app@sha256:...
volumeMounts:
- name: system-info
mountPath: /run/ate # the actor reads /run/ate/actor-id
Each dataSources entry sets exactly one source type (CEL-enforced, same pattern as VolumeSource). path is relative to the volume root.
Data sources
Semantics
- Read-only bind mount; contents are generated on the host by atelet, never written by the workload.
- Regenerated on every Run/Restore, before the sandbox starts, regardless of what the actor boots from.
- Never captured into snapshots: volume roots live on the host outside the durable-dir tree and outside the guest filesystem delta, and are wiped and rebuilt each Run/Restore. Generated identity material must not appear in checkpointed state.
- Atomic updates: files are written with Kubernetes' AtomicWriter (vendored), so a data source refreshed while the actor is running can never be observed half-written.
- Micro-VM gap: the micro-VM runtime currently drops all non-default mounts (same pre-existing limitation the old /run/ate mount had), so SystemInfo volumes are gVisor-only until per-actor volumes are plumbed into the guest.
Summary
Add a "SystemInfo" volume source that delivers substrate-generated, per-actor files into an actor's containers, similar to Kubernetes projected volumes / downwardAPI. The volume is declared in spec.volumes with a list of data sources, each of which writes one file at a configurable relative path, and is bind-mounted read-only wherever a container mounts it.
This replaces the hardcoded /run/ate/actor-id identity mount with an explicit and extensible API: templates opt in, choose the mount location and file layout, and future identity material (JWTs, certificates) can be added as new data sources without inventing new mount conventions.
Why a volume, not env vars or baked files
Per-actor identity data must never be part of an actor's checkpointed state. Anything living in checkpointed process memory (env vars) or in the container image is frozen into snapshots: it goes stale across suspend/resume cycles, and when a snapshot seeds a different actor than the one that created it, every actor restored from it observes the same wrong values.
SystemInfo volume contents are instead regenerated by atelet on the host on every Run/Restore — whatever the boot source (cold boot, a shared template snapshot, or the actor's own prior snapshot) — so the mounted files always carry the resumed actor's own, current values. Workloads should read them fresh rather than caching at startup.
Proposed API
Each dataSources entry sets exactly one source type (CEL-enforced, same pattern as VolumeSource). path is relative to the volume root.
Data sources
Semantics