Skip to main content

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 container
  • container.start() - Start the container
  • container.stop(timeout=30) - Stop the container
  • container.remove() - Remove the container
  • container.logs(tail=100) - Get container logs
  • container.wait_healthy(timeout=60) - Wait for healthy status
  • container.exec(command) - Execute a command in the container
  • container.id - Container ID
  • container.status - Current status string

Runtime

  • Runtime(options=None) - Create a new runtime
  • Runtime.create(options=None) - Create a runtime asynchronously
  • runtime.deploy_spec(path) - Deploy from a YAML file
  • runtime.deploy_yaml(yaml) - Deploy from a YAML string
  • runtime.scale(deployment, service, replicas) - Scale a service
  • runtime.status(deployment=None) - Get status
  • runtime.list_services() - List all services
  • runtime.get_container(service, replica=1) - Get a container
  • runtime.remove_service(service) - Remove a service
  • runtime.shutdown() - Shutdown the runtime

ImageBuilder

  • ImageBuilder(context, dockerfile=None) - Create a new builder
  • builder.tag(tag) - Add a tag
  • builder.tags(tags) - Add multiple tags
  • builder.arg(name, value) - Set a build argument
  • builder.args(args) - Set multiple build arguments
  • builder.target(stage) - Set target stage
  • builder.runtime(name) - Use a runtime template
  • builder.no_cache() - Disable caching
  • builder.auth(registry, username, password) - Set registry auth
  • builder.build() - Build the image
  • builder.push(tag=None) - Push to registry

Spec

  • Spec.from_yaml(yaml) - Parse from YAML string
  • Spec.from_file(path) - Parse from file
  • spec.version - Spec version
  • spec.deployment - Deployment name
  • spec.services - List of service names
  • spec.get_service(name) - Get a service spec
  • spec.to_yaml() - Convert to YAML
  • spec.to_dict() - Convert to dict

Helper Functions

  • run(image, name=None, ports=None, env=None, command=None, detach=True) - Run a container quickly
  • build(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 dict
  • validate_spec(yaml) - Validate a YAML spec
  • detect_runtime(path) - Detect runtime from project
  • list_runtimes() - List available runtimes
  • is_buildah_available() - Check if buildah is installed
  • buildah_install_instructions() - Get install instructions
  • create_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zlayer-0.11.3.tar.gz (1.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

zlayer-0.11.3-cp38-abi3-win_amd64.whl (14.9 MB view details)

Uploaded CPython 3.8+Windows x86-64

zlayer-0.11.3-cp38-abi3-manylinux_2_28_x86_64.whl (19.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ x86-64

zlayer-0.11.3-cp38-abi3-manylinux_2_28_aarch64.whl (17.6 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ ARM64

zlayer-0.11.3-cp38-abi3-macosx_11_0_arm64.whl (14.5 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

zlayer-0.11.3-cp38-abi3-macosx_10_13_x86_64.whl (16.3 MB view details)

Uploaded CPython 3.8+macOS 10.13+ x86-64

File details

Details for the file zlayer-0.11.3.tar.gz.

File metadata

  • Download URL: zlayer-0.11.3.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for zlayer-0.11.3.tar.gz
Algorithm Hash digest
SHA256 9d6bde4c326b84aec5af6f7c0f7e595f502fac6f110a4cf60484488bf0350886
MD5 409e04e8eb39b86c2623189654a3f478
BLAKE2b-256 217577125c942aeab2cf93df0edf3b438e3ee41eb480fc7a0cbf33e9edf10a0e

See more details on using hashes here.

File details

Details for the file zlayer-0.11.3-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: zlayer-0.11.3-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 14.9 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

Hashes for zlayer-0.11.3-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f69e7e7c49abce3f68bceab89e32aa3564cf410b33c3d7d6db8d3f22e9cac0f8
MD5 de02120a77d0274633477edf151931a7
BLAKE2b-256 8c0c9118e2f1fb4ba44a7c080058f4f41cb5f3b151c9ac45482bcb757a2e83c3

See more details on using hashes here.

File details

Details for the file zlayer-0.11.3-cp38-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zlayer-0.11.3-cp38-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3e52a52b2433c58b0a8f065ec91ae2d008d67db3537f2fccd9cb109ed1cbcf0b
MD5 31669e6c436cabc0810fff649e49c658
BLAKE2b-256 7438dd0a0c5c5f88c6c04e31d2f8980a549629dfb917bf9231ba4a9cb5419c05

See more details on using hashes here.

File details

Details for the file zlayer-0.11.3-cp38-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zlayer-0.11.3-cp38-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e2d6742e1923d59859b3ea579d7a65cced150041c19612864282d8709791afac
MD5 efdf3c451779d41d1232d7d95a1c34a5
BLAKE2b-256 d09c6f6be7b9e0f3f16db56fca001f22723f17dcf9b5d5db340dc5e90ac9b700

See more details on using hashes here.

File details

Details for the file zlayer-0.11.3-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zlayer-0.11.3-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a3f90f6ee75c73c9487ff5c06e3a004db2fd021283d12bc7a41b0e9fbc55379
MD5 313f5c65d702276cadb3bba68ff55afc
BLAKE2b-256 b660f250059bce563135642b552194b99d4ab7786c1647f1be62f1284cf70875

See more details on using hashes here.

File details

Details for the file zlayer-0.11.3-cp38-abi3-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for zlayer-0.11.3-cp38-abi3-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a4edb74628ba1c266c9bd3fde3fa01b5f2dd07908351a03d0a4cf35634ee1deb
MD5 c22ce8e3c7e14392846b31aeb56147ae
BLAKE2b-256 963fd5f938ab3603b983bf37f85877b3f53bad374ff5ba7273c34316b9047ee3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page