tino is a tiny init process (PID 1) for Docker, Kubernetes, and other container workloads. It is a practical tini alternative with signal forwarding, subreaper support, command argument expansion without /bin/sh, and optional Linux Landlock restrictions.
Why Use tino as PID 1
- Runs as PID 1 and forwards signals to the managed process.
- Reaps orphaned children with
-s/--subreaper. - Supports parent-death signals, grace timeouts, and exit-code remapping.
- Expands
${VAR}and${VAR:-default}in child arguments without requiring/bin/sh. - On Linux, can restrict writes, TCP ports, IPC scope, executable paths, and device
ioctlwith Landlock.
Install tino
Install with Cargo:
Build a release binary:
Copy tino into your own image:
COPY --from=lvillis/tino:latest /sbin/tino /sbin/tino
ENTRYPOINT ["/sbin/tino", "-g", "-s", "--"]
CMD ["/opt/app/service"]
Use tino in Docker and Kubernetes
Run a command locally:
Use argument expansion without a shell:
ENTRYPOINT ["/sbin/tino", "--expand-env", "--"]
CMD ["/opt/app/service", "--port=${SERVICE_PORT:-8900}"]
Inspect the final command and effective restrictions without executing the child:
--expand-env is not a shell. Supported forms are ${VAR}, ${VAR:-default}, and $$ for a literal dollar sign. Unbraced $VAR is left unchanged.
Restrict container access with Landlock
Landlock-based restrictions require Linux 5.13+ with Landlock enabled.
--write-restrict,--write-allow,--write-preset,--write-no-dev,--write-warn-only--bind-tcp-allow,--connect-tcp-allowrequire Landlock ABI v4+--device-ioctl-allowrequires Landlock ABI v5+--scope-signals,--scope-abstract-unixrequire Landlock ABI v6+--exec-allowrestricts which executables the child may launch after startup
Example:
If Docker blocks landlock_* syscalls, use the bundled seccomp profile:
To make that the Docker default:
Refresh the profile with:
Download binary releases
GitHub Releases publish versioned archives with a single top-level directory:
tino-<version>-<os>-<arch>-<abi>/
tino
LICENSE
README.md
Supported assets:
| OCI platform | Rust target | Release asset |
|---|---|---|
linux/amd64 |
x86_64-unknown-linux-gnu |
tino-<version>-linux-x86_64-gnu.tar.gz |
linux/amd64 |
x86_64-unknown-linux-musl |
tino-<version>-linux-x86_64-musl.tar.gz |
linux/arm64 |
aarch64-unknown-linux-musl |
tino-<version>-linux-aarch64-musl.tar.gz |
linux/arm/v6 |
arm-unknown-linux-gnueabihf |
tino-<version>-linux-arm-gnueabihf.tar.gz |
linux/arm/v7 |
armv7-unknown-linux-gnueabihf |
tino-<version>-linux-armv7-gnueabihf.tar.gz |
Each release also includes:
SHA256SUMS- per-asset
*.spdx.jsonSBOM files - GitHub artifact attestations for archives and SBOMs
Environment defaults
These environment variables act as defaults. Explicit CLI flags still win.
TINI_SUBREAPERTINI_KILL_PROCESS_GROUPTINI_VERBOSITY
Testing
On Unix targets, tests/unix_behaviour.rs covers the CLI license output, missing-command errors, exit-code remapping, environment expansion, and Landlock behavior.