Python bindings for ZLayer, a lightweight Rust-based container orchestrator with built-in networking, scaling, and observability.
Project description
zlayer
Python bindings for ZLayer — a lightweight, Rust-based container orchestration platform with built-in networking, scaling, and observability. ZLayer uses libcontainer (from youki) for direct container management without requiring a daemon.
This package ships prebuilt abi3 wheels (one wheel per OS/arch works on
CPython 3.8+), so pip install zlayer does not require a Rust toolchain.
Installation
From PyPI
pip install zlayer
From Source
# Requires Rust toolchain and maturin
pip install maturin
cd crates/zlayer-py
maturin develop
Quickstart: driving a remote daemon from Python
The zlayer.Client class talks to a running zlayer daemon over its Unix
socket — the same socket the zlayer CLI uses. zlayer.ensure_daemon()
bootstraps the zlayer binary if it isn't on PATH yet (downloaded into
~/.local/share/zlayer/bin/).
import asyncio
import zlayer
async def main():
# Make sure a `zlayer` binary is installed and the daemon is running.
# Returns the path to the binary. Use system=True to install system-wide
# via `sudo zlayer daemon install`.
zlayer.ensure_daemon()
# Connect to the local daemon (defaults to the standard Unix socket).
client = zlayer.Client()
# Deploy a spec and list running containers.
await client.deploy("deployment.yaml")
for container in await client.ps():
print(container)
asyncio.run(main())
Embedded runtime and builder
For in-process orchestration (no daemon required), ZLayer exposes a full
Runtime and ImageBuilder API:
import asyncio
from zlayer import Runtime, Container, ImageBuilder
async def main():
# Deploy from a spec file
runtime = Runtime()
await runtime.deploy_spec("deployment.yaml")
# Scale a service
await runtime.scale("my-deployment", "api", 3)
# Check status
status = await runtime.status()
print(status)
asyncio.run(main())
Quick Container Run
The easiest way to run a container is using the run() function:
import asyncio
import zlayer
async def main():
# Run nginx with port mapping
container = await zlayer.run("nginx:latest", ports={80: 8080})
print(f"Started: {container.id}")
# Run redis with a custom name
container = await zlayer.run("redis:alpine", name="my-redis")
# Run a one-shot command (waits for completion)
container = await zlayer.run(
"python:3.12",
command=["python", "-c", "print('hello')"],
detach=False
)
# Run with environment variables
container = await zlayer.run(
"postgres:16",
ports={5432: 5432},
env={"POSTGRES_PASSWORD": "secret"}
)
# Stop and clean up
await container.stop()
await container.remove()
asyncio.run(main())
Working with Containers
import asyncio
from zlayer import Container
async def main():
# Create a container from an image
container = Container.create(
"nginx:latest",
ports={"http": 80},
env={"NGINX_HOST": "localhost"}
)
# Start the container
await container.start()
# Wait for it to be healthy
await container.wait_healthy(timeout=30)
# Get logs
logs = await container.logs(tail=50)
print(logs)
# Stop and remove
await container.stop()
await container.remove()
asyncio.run(main())
Building Images
Quick Build (Convenience Function)
The simplest way to build an image is using the build() function:
import asyncio
import zlayer
async def main():
# Simple build
image = await zlayer.build("./app", tag="myapp:latest")
print(f"Built: {image}")
# Build with custom Dockerfile
image = await zlayer.build(".", tag="api:v1", dockerfile="Dockerfile.prod")
# Build with arguments
image = await zlayer.build(
"./app",
tag="myapp:latest",
build_args={"VERSION": "1.0.0", "DEBUG": "false"}
)
# Build without cache
image = await zlayer.build("./app", tag="myapp:latest", no_cache=True)
asyncio.run(main())
ImageBuilder (Full Control)
For more control over the build process, use the ImageBuilder class:
import asyncio
from zlayer import ImageBuilder, detect_runtime
async def main():
# Auto-detect runtime from project files
detected = detect_runtime("./my-app")
if detected:
print(f"Detected: {detected.name}")
# Build an image
builder = ImageBuilder("./my-app")
builder.tag("myapp:latest")
builder.tag("myapp:v1.0.0")
# Optionally use a runtime template
builder.runtime("node20")
# Build
image = await builder.build()
print(f"Built: {image.id}")
asyncio.run(main())
Working with Specs
from zlayer import Spec, validate_spec
# Validate a spec
yaml_content = """
version: v1
deployment: my-app
services:
api:
rtype: service
image:
name: myapp:latest
endpoints:
- name: http
protocol: http
port: 8080
"""
# Validate
is_valid = validate_spec(yaml_content)
print(f"Valid: {is_valid}")
# Parse
spec = Spec.from_yaml(yaml_content)
print(f"Deployment: {spec.deployment}")
print(f"Services: {spec.services}")
# Access service details
api = spec.get_service("api")
if api:
print(f"Image: {api.image}")
print(f"Endpoints: {api.endpoints}")
API Reference
Container
Container.create(image, ports=None, env=None, name=None)- Create a new containercontainer.start()- Start the containercontainer.stop(timeout=30)- Stop the containercontainer.remove()- Remove the containercontainer.logs(tail=100)- Get container logscontainer.wait_healthy(timeout=60)- Wait for healthy statuscontainer.exec(command)- Execute a command in the containercontainer.id- Container IDcontainer.status- Current status string
Runtime
Runtime(options=None)- Create a new runtimeRuntime.create(options=None)- Create a runtime asynchronouslyruntime.deploy_spec(path)- Deploy from a YAML fileruntime.deploy_yaml(yaml)- Deploy from a YAML stringruntime.scale(deployment, service, replicas)- Scale a serviceruntime.status(deployment=None)- Get statusruntime.list_services()- List all servicesruntime.get_container(service, replica=1)- Get a containerruntime.remove_service(service)- Remove a serviceruntime.shutdown()- Shutdown the runtime
ImageBuilder
ImageBuilder(context, dockerfile=None)- Create a new builderbuilder.tag(tag)- Add a tagbuilder.tags(tags)- Add multiple tagsbuilder.arg(name, value)- Set a build argumentbuilder.args(args)- Set multiple build argumentsbuilder.target(stage)- Set target stagebuilder.runtime(name)- Use a runtime templatebuilder.no_cache()- Disable cachingbuilder.auth(registry, username, password)- Set registry authbuilder.build()- Build the imagebuilder.push(tag=None)- Push to registry
Spec
Spec.from_yaml(yaml)- Parse from YAML stringSpec.from_file(path)- Parse from filespec.version- Spec versionspec.deployment- Deployment namespec.services- List of service namesspec.get_service(name)- Get a service specspec.to_yaml()- Convert to YAMLspec.to_dict()- Convert to dict
Helper Functions
run(image, name=None, ports=None, env=None, command=None, detach=True)- Run a container quicklybuild(path, tag, dockerfile=None, build_args=None, no_cache=False, progress=True)- Build an image (convenience function)parse_spec(yaml)- Parse a YAML spec to dictvalidate_spec(yaml)- Validate a YAML specdetect_runtime(path)- Detect runtime from projectlist_runtimes()- List available runtimesis_buildah_available()- Check if buildah is installedbuildah_install_instructions()- Get install instructionscreate_service_spec(name, image, port=None)- Create a service spec
Requirements
- Python 3.8+
- For image building: buildah installed on the system
- For container runtime: youki or similar OCI runtime
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zlayer-0.11.13.tar.gz.
File metadata
- Download URL: zlayer-0.11.13.tar.gz
- Upload date:
- Size: 1.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75eef291855104ce35d47eedce0e633c2533646778e387e1a44cc9123fc41388
|
|
| MD5 |
8a35285555b52b933853632f171e437f
|
|
| BLAKE2b-256 |
8dedd72cbfd9bead96de47b50977e58cd4e8d7e94a1fe1b7582eefc43babdc9a
|
File details
Details for the file zlayer-0.11.13-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: zlayer-0.11.13-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 15.2 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a039a3588a18a86b7b4e29fc7712dba33366208aed01ca7f135670bc7ae5289
|
|
| MD5 |
06d47fb639b3fae60bbb64b92494ad29
|
|
| BLAKE2b-256 |
f22a6210b8d329066ffaf1567d859129e89ecce157bec5c8cabd6a0572709428
|
File details
Details for the file zlayer-0.11.13-cp38-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: zlayer-0.11.13-cp38-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 19.4 MB
- Tags: CPython 3.8+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b8b5e2850e81a9ae85f67a0d6376a31b79ae82593ff9b22d7643bbba7b22214
|
|
| MD5 |
67ac5db99e8ecaf2c2bbe0a7349fb964
|
|
| BLAKE2b-256 |
6227b7ab53c5b406166a872f4b68db6705fef664252669e30d885d902d617f6c
|
File details
Details for the file zlayer-0.11.13-cp38-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: zlayer-0.11.13-cp38-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 17.9 MB
- Tags: CPython 3.8+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58e9bab398c3e564a27a0cb03b18c97fb21eb221fe7f8975db763b751e869a37
|
|
| MD5 |
aba6861279253cab172b430c7fa48e13
|
|
| BLAKE2b-256 |
60506d323dbc9c7ae1e4e34fbb2b060c3c5505abe915ed3a5b0ef0e35e151648
|
File details
Details for the file zlayer-0.11.13-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: zlayer-0.11.13-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 14.8 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd34c2bde14641845ad7415aa027d8aaf7222ae22ea8516f0407608ea814317b
|
|
| MD5 |
32538a27d66720c1b2ebf3024c5f25e5
|
|
| BLAKE2b-256 |
e32f6ef064bccd595b9f97b9f41d7d8192b30c512c68d3c6c2d509a4ab3ca68e
|
File details
Details for the file zlayer-0.11.13-cp38-abi3-macosx_10_13_x86_64.whl.
File metadata
- Download URL: zlayer-0.11.13-cp38-abi3-macosx_10_13_x86_64.whl
- Upload date:
- Size: 16.7 MB
- Tags: CPython 3.8+, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23811840328c5aa5692226b950d409d88cb6a78e3162d19ea12c3712c39f034d
|
|
| MD5 |
c45e85d5eecbfce2626a2601760787f7
|
|
| BLAKE2b-256 |
5c409ac662807c0f43e34452948c2d6ac6d5dfe3eb0bd1749fbb268ad4b25b87
|