Process runner

Run native processes (no Docker) under Rune. Useful for legacy binaries, agents, and dev workflows.

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.

When to use it

  • 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.

Spec

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.

Required vs. optional fields

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.

Health checks

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.

Security context

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:).

Logs

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).

Limits

  • 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.

When to migrate to a container

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