Skip to content

Process runner

Not everything is a container. Rune ships a process runner alongside the Docker runner, so you can supervise a native binary the same way you’d supervise a container.

  • Legacy binaries that don’t containerize cleanly.
  • Local development where Docker is heavyweight.
  • System-level agents that need direct host access.
  • Anything that needs to share the host’s network stack with zero overhead.
service:
name: agent
namespace: default
scale: 1
process:
command: /usr/local/bin/myagent
args:
- --config
- /etc/myagent/agent.toml
workdir: /var/lib/myagent
env:
AGENT_LOG_LEVEL: info
health:
liveness:
type: tcp
port: 9100
intervalSeconds: 10

The presence of process: (and absence of image:) tells Rune to use the process runner.

FieldRequiredNotes
commandyesAbsolute path to the executable on the host.
argsnoList of string arguments.
workdirnoWorking directory. Defaults to /.
envnoEnvironment variables (merged with envFrom).
securityContextnoUser, group, capabilities, read-only FS — see below.

The runner watches the PID — process death is detected immediately and triggers a restart. On top of that, you can declare an HTTP or TCP probe to catch hung-but-alive processes. Same shape as containers.

process:
command: /usr/local/bin/myagent
securityContext:
user: rune-agent
group: rune-agent
readOnlyFS: true
capabilities: [NET_BIND_SERVICE]
deniedSyscalls: [ptrace, mount]
FieldStatus today
user, groupImplemented — process runs as that uid/gid.
readOnlyFSAccepted; not enforced yet — logs a warning.
capabilitiesAccepted; not enforced yet (Linux only).
allowedSyscalls/deniedSyscallsAccepted; not enforced yet.

For now, treat readOnlyFS / capabilities / syscalls as documentation of intent. Until they’re enforced, prefer running under a dedicated unprivileged user (user:).

The process runner captures stdout and stderr line-by-line. rune logs <name> works the same as for containers.

If your process logs to a file, you’ll need to either redirect to stdout in your wrapper script, or wait for log forwarding (RUNE-074).

  • No image versioning. With containers you pin myimage:1.2.3. With processes, the binary on disk is whatever’s there. Use immutable filesystem layouts or a deploy script that updates atomically.
  • No isolation. A process service shares the host kernel, FS, and networking. One misbehaving process can affect others on the same host.
  • No cross-host portability. A process service binds you to a specific host’s runtime — its libc, paths, etc.

If you find yourself building chroot wrappers, custom init scripts, or copying binaries into systemd units, you’ve outgrown the process runner. Containerize.