provisioning-platform/prov-ecosystem/crates/runtime/README.md

273 lines
5.9 KiB
Markdown

# Runtime - Container Runtime Abstraction
A unified abstraction layer for managing multiple container runtimes with automatic detection and platform-aware selection.
## Overview
Runtime provides a unified API for working with different container runtimes:
- 🐳 **Docker** - Industry standard container runtime
- 🐋 **Podman** - Open-source Docker alternative with rootless support
- 🪨 **OrbStack** - Fast macOS Docker alternative (default on macOS)
- 🎨 **Colima** - Another macOS Docker alternative
- 📦 **nerdctl** - containerd CLI tool
## Features
- 🔄 **Unified API** - Same interface for all runtimes
- 🎯 **Auto-Detection** - Detect available runtimes with platform awareness
- 🔌 **Remote Support** - SSH-based access to remote runtimes
- 🐳 **Compose Support** - Docker Compose file handling
- 🔧 **Configuration** - Flexible runtime configuration
-**Platform-Aware** - Intelligent defaults per OS/platform
## Supported Runtimes
### Docker
Industry-standard container runtime
```rust
use runtime::RuntimeType;
let runtime = RuntimeType::Docker;
// Socket: /var/run/docker.sock
// Compose: docker compose
```
### Podman
Docker-compatible with rootless support
```rust
let runtime = RuntimeType::Podman;
// Socket: $XDG_RUNTIME_DIR/podman/podman.sock
// Compose: podman-compose
```
### OrbStack
Fast Docker alternative for macOS (default on macOS)
```rust
let runtime = RuntimeType::OrbStack;
// Socket: ~/.orbstack/run/docker.sock
// Compose: docker compose
```
### Colima
Another macOS Docker alternative
```rust
let runtime = RuntimeType::Colima;
// Socket: ~/.colima/docker.sock
// Compose: docker compose
```
### nerdctl
containerd CLI tool
```rust
let runtime = RuntimeType::Nerdctl;
// Socket: unix:///run/containerd/containerd.sock
// Compose: nerdctl compose
```
## Quick Start
```rust
use runtime::{detect_runtime, RuntimeConfig};
// Auto-detect available runtime
let runtime = detect_runtime().await?;
println!("Using: {}", runtime.name());
// Or create configuration manually
let config = RuntimeConfig {
runtime: RuntimeType::Docker,
socket_path: "/var/run/docker.sock".to_string(),
..Default::default()
};
let runtime = Runtime::new(config);
let info = runtime.info().await?;
println!("Version: {}", info.version);
```
## Detection Priority
### macOS
1. OrbStack (fastest native integration)
2. Docker Desktop
3. Colima
4. Podman
5. nerdctl
### Linux
1. Docker
2. Podman (rootless)
3. nerdctl
4. Colima
5. OrbStack
## Remote Runtime Access
Connect to remote runtimes via SSH:
```rust
use runtime::{RuntimeConfig, RemoteConfig};
let remote = RemoteConfig {
enabled: true,
host: "docker.example.com".to_string(),
user: "docker-user".to_string(),
private_key: Some("/home/user/.ssh/id_rsa".to_string()),
..Default::default()
};
let config = RuntimeConfig {
remote_config: Some(remote),
..Default::default()
};
```
## Docker Compose Support
Adapt Docker Compose files for different runtimes:
```rust
use runtime::adapt_compose;
let adapted = adapt_compose(
"docker-compose.yaml",
RuntimeType::Podman
).await?;
println!("Adapted compose: {}", adapted);
```
## Configuration
### Environment Variables
```rust
let config = RuntimeConfig {
environment: [
("DOCKER_HOST", "unix:///var/run/docker.sock"),
("DOCKER_TLS_VERIFY", "1"),
].iter().cloned().collect(),
..Default::default()
};
```
### Socket Paths
```rust
let config = RuntimeConfig {
socket_path: "/var/run/docker.sock".to_string(),
..Default::default()
};
```
### Command Flags
```rust
let config = RuntimeConfig {
flags: vec![
"--tlsverify".to_string(),
"--tlscacert=/path/to/ca.pem".to_string(),
],
..Default::default()
};
```
## Architecture
- `error.rs` - Error types for runtime operations
- `runtime_type.rs` - RuntimeType enum with socket paths
- `config.rs` - Configuration structures
- `detect.rs` - Async runtime detection
- `compose.rs` - Docker Compose adaptation
- `runtime.rs` - Main runtime abstraction
## Use Cases
### Container Orchestration
Manage containers across different runtimes
### CI/CD Integration
Build and run containers in pipelines
### Local Development
Detect and use available runtime on developer machines
### Multi-Cloud Deployments
Support different runtimes in different environments
### Rootless Execution
Use Podman for non-root container execution
## Compatibility Matrix
| Operation | Docker | Podman | OrbStack | Colima | nerdctl |
|-----------|--------|--------|----------|--------|---------|
| build | ✅ | ✅ | ✅ | ✅ | ✅ |
| run | ✅ | ✅ | ✅ | ✅ | ✅ |
| compose | ✅ | ✅ | ✅ | ✅ | ✅ |
| push | ✅ | ✅ | ✅ | ✅ | ✅ |
| pull | ✅ | ✅ | ✅ | ✅ | ✅ |
## Testing
Run tests with:
```bash
cargo test --lib
```
All 24 tests pass with full coverage of:
- Runtime detection
- Configuration management
- Socket path handling
- Compose adaptation
- Remote configuration
## Performance
- Fast runtime detection
- Minimal overhead
- Efficient socket communication
- Low memory footprint
## API Documentation
Full API documentation available with:
```bash
cargo doc --open
```
## Integration
Runtime can be integrated with:
- Container orchestration systems
- CI/CD pipelines
- Deployment automation (provctl, provisioning)
- Development tools
- Infrastructure management
## Platform Support
- ✅ Linux (all architectures)
- ✅ macOS (Intel and Apple Silicon)
- ✅ Windows (with WSL2)
- ✅ Remote servers (SSH)
## License
Same as prov-ecosystem parent project
## Contributing
Contributions welcome! See parent project guidelines.
## See Also
- [prov-ecosystem README](../../README.md) - Parent project overview
- [valida](../valida/README.md) - Validation rules engine
- [encrypt](../encrypt/README.md) - Multi-backend encryption
- [init-servs](../init-servs/README.md) - Init system abstraction