orodruin
orodruin is a cross-platform CLI for managing project-specific container environments with one consistent workflow.
It reads an orodruin.toml file, resolves an environment, and then delegates container operations to the runtime that matches your OS:
- macOS uses Apple Container CLI via
container - Linux uses Podman via
podman
The same orodruin commands work on both platforms, but a few backend-only subcommands are only available on macOS. On Linux, unsupported Apple-only commands are hidden from help and return a clear error if invoked directly.
What You Can Do
- Create a starter config with
orodruin init - Build, create, enter, inspect, and remove environment containers
- Run commands inside an environment with
orodruin run - Forward common container, image, registry, volume, network, builder, system, and machine commands to the active runtime
- Generate shell completions and print build/version info
Requirements
- Rust toolchain (
cargo,rustc,rustup) - Linux: Podman installed and available on your
PATH - macOS: Apple Container CLI installed and available on your
PATH
Install
If you want to install the binary from this repository, use Cargo directly:
That installs the CLI binaries into Cargo's binary directory, usually ~/.cargo/bin.
The primary command is orodruin; rui is provided as a shorter alias.
Build From Source
Clone the repository and build the release binary:
The compiled binaries will be available at target/release/orodruin and target/release/rui.
Run the library tests while you are here:
Quick Start
- Create a starter configuration:
This creates orodruin.toml in the current directory if it does not already exist.
- Review or customize the config.
Here is a minimal example with one image-based environment and one build-based environment:
[]
= "demo"
= "dev"
[]
= "ubuntu:latest"
= "/workspace/demo"
= "/workspace/demo"
= ["/bin/bash"]
= ["sleep", "infinity"]
= ["SSH_AUTH_SOCK"]
[]
= { = ".", = "Dockerfile", = "demo-api:latest" }
= "/workspace/demo"
= "/workspace/demo"
= ["/bin/bash"]
- Create the environment container:
- Enter the environment:
- Run a one-off command in the container:
How Configuration Works
orodruinlooks fororodruin.tomlin the current directory and parent directories unless you pass--config <path>.- The config must define at least one environment under
[envs.<name>]. - Every environment must define exactly one of
imageorbuild. - Use
project.default_envwhen you wantenterto work without explicitly naming an environment.
Runtime Selection
You do not pick the runtime manually.
- On macOS,
orodruindelegates to Apple Container CLI - On Linux,
orodruindelegates to Podman
That means the same user-facing command can fan out to a different backend command depending on your platform.
Examples:
orodruin pull alpine:latestrunspodman pull alpine:lateston Linux andcontainer image pull alpine:lateston macOSorodruin imagesrunspodman imageson Linux andcontainer image liston macOSorodruin cp src dstrunspodman cp src dston Linux andcontainer copy src dston macOS
Command Reference
Project Workflow Commands
| Command | What it does | Example |
|---|---|---|
orodruin init |
Create a starter orodruin.toml in the current directory |
orodruin init |
orodruin create <env> |
Create the environment container and start it if needed | orodruin create dev |
orodruin enter [env] |
Open an interactive shell in the container | orodruin enter |
orodruin run <env> -- <command> |
Run a command inside the environment container | orodruin run dev -- cargo test |
orodruin list |
Show configured environments and container state | orodruin list |
orodruin rm <env> |
Remove an environment container | orodruin rm dev |
orodruin inspect <env> |
Show the resolved config and container details | orodruin inspect dev |
Notes:
list --jsonprints structured JSON for scripting.inspect <env> --jsonprints the resolved environment and container inspect payload as JSON.- Global
--yesauto-approves prompts such as starting the Apple container system.
Notes:
enterdefaults toproject.default_envor the only configured environment when possible.runexpects the command after--.
Runtime Passthrough Commands
These commands forward directly to the active runtime. The orodruin syntax is the same on both platforms, but the backend command differs.
| Command | Linux / Podman | macOS / Apple Container |
|---|---|---|
orodruin pull <image> |
podman pull <image> |
container image pull <image> |
orodruin images |
podman images |
container image list |
orodruin rmi <image> |
podman rmi <image> |
container image delete <image> |
orodruin ps |
podman ps |
container list |
orodruin logs [args...] |
podman logs [args...] |
container logs [args...] |
orodruin build <args...> |
podman build <args...> |
container build <args...> |
orodruin cp <src> <dst> |
podman cp <src> <dst> |
container copy <src> <dst> |
orodruin login [args...] |
podman login [args...] |
container registry login [args...] |
orodruin logout [args...] |
podman logout [args...] |
container registry logout [args...] |
Examples:
Grouped Subcommands
orodruin also exposes container runtime subcommand groups. These are helpful when you want a closer match to the underlying CLI.
| Group | Example |
|---|---|
orodruin image pull <image> |
orodruin image pull alpine:latest |
orodruin image list |
orodruin image list |
orodruin image inspect <image> |
orodruin image inspect alpine:latest |
orodruin image load [args...] |
orodruin image load -i image.tar |
orodruin image remove <image> |
orodruin image remove alpine:latest |
orodruin image push <image> |
orodruin image push registry.example.com/demo:latest |
orodruin image prune [args...] |
orodruin image prune --all |
orodruin image save [args...] |
orodruin image save alpine:latest -o alpine.tar |
orodruin image tag <image> |
orodruin image tag alpine:latest demo:latest |
orodruin container create [args...] |
orodruin container create --name demo alpine:latest |
orodruin container exec [args...] |
orodruin container exec -it demo -- bash |
orodruin container export [args...] |
orodruin container export demo > demo.tar |
orodruin container kill [args...] |
orodruin container kill demo |
orodruin container list |
orodruin container list |
orodruin container inspect <container> |
orodruin container inspect demo |
orodruin container logs [args...] |
orodruin container logs demo |
orodruin container prune [args...] |
orodruin container prune --all |
orodruin container remove <container> |
orodruin container remove demo |
orodruin container run [args...] |
orodruin container run --name demo alpine:latest sleep infinity |
orodruin container start <container> |
orodruin container start demo |
orodruin container stats [args...] |
orodruin container stats demo |
orodruin container stop <container> |
orodruin container stop demo |
orodruin registry list |
orodruin registry list |
orodruin registry login [args...] |
orodruin registry login registry.example.com |
orodruin registry logout [args...] |
orodruin registry logout registry.example.com |
orodruin volume list |
orodruin volume list |
orodruin volume create <name> |
orodruin volume create cache |
orodruin volume inspect <name> |
orodruin volume inspect cache |
orodruin volume prune [args...] |
orodruin volume prune |
orodruin volume remove <name> |
orodruin volume remove cache |
orodruin network list |
orodruin network list |
orodruin network create <name> |
orodruin network create demo-net |
orodruin network inspect <name> |
orodruin network inspect demo-net |
orodruin network prune [args...] |
orodruin network prune |
orodruin network remove <name> |
orodruin network remove demo-net |
orodruin builder status |
orodruin builder status |
orodruin builder remove [args...] |
orodruin builder remove |
orodruin system df |
orodruin system df |
orodruin system logs |
orodruin system logs |
orodruin system status |
orodruin system status |
orodruin system version |
orodruin system version |
orodruin machine list |
orodruin machine list |
orodruin machine inspect |
orodruin machine inspect |
orodruin machine logs |
orodruin machine logs |
orodruin machine create |
orodruin machine create |
orodruin machine run |
orodruin machine run |
orodruin machine set |
orodruin machine set |
orodruin machine stop |
orodruin machine stop |
Platform-Specific Notes
Some backend commands are only available on one platform:
- Linux / Podman does not expose
registry list,builder start,builder stop,system dns,system kernel,system property,system start,system stop, ormachine set-default - macOS / Apple Container supports those commands and shows them in help
Handy Commands
Using with LLM Coding Agents
If you use orodruin with agent instruction files such as AGENTS.md, SKILLS.md, or other repository-specific guidance, tell the agent to run project commands inside the environment container instead of on the host.
A good default instruction looks like this:
This repository uses `orodruin` for its development environment.
- ----
Examples:
- ---
For most agents, the simplest rule is:
- do not run
cargo,python,npm,go, or other project tools directly on the host when they are intended to run inside the container - instead, wrap them with
orodruin run <env> -- ...
If your repository has a default environment, you can also use shorter forms such as:
If you want the agent to be extra safe, add a note like this too:
If a command fails because the environment container does not exist yet, run `orodruin create dev` first and retry the command inside the container.
Development
Useful commands while iterating locally:
License
This project is distributed under the terms of the repository's license files.