A Pythonic client for the Docker/Podman Engine API.
Project description
Bollard
A Pythonic, zero-dependency client for the Docker and Podman Engine APIs. Prioritizes descriptive naming, context managers, and cross-platform ease of use.
Installation
pip install bollard
Project Structure
For a detailed overview of the project's architecture, see ARCHITECTURE.md.
Key Features
- Pythonic API:
list_containersinstead ofps;remove_imageinstead ofrmi. - Zero Dependencies: Uses only the Python standard library (
http.client,socket,json). - Smart Connection: Auto-detects Docker/Podman sockets (Unix, Windows Pipes,
DOCKER_HOST). - Windows Friendly: Auto-starts the Podman machine on Windows if connection fails.
- Resource Safety: Context managers for client connections and ephemeral containers.
- Streaming Output: Real-time progress updates for long-running operations like pull and build.
- .dockerignore Support: Respects
.dockerignorefiles when building images. - Full Lifecycle: Manage Containers, Images, Networks, and Volumes.
Usage
Basic Connection
from bollard import DockerClient
with DockerClient() as client:
for image in client.list_images():
print(f"Image: {image.tags[0]}")
Managing Containers
with DockerClient() as client:
# Run a container and get logs
container = client.run_container("alpine:latest", command="echo 'Hello World'")
print(container.logs())
# Stop and remove
container.stop()
container.remove(force=True)
Ephemeral Containers (Auto-Cleanup)
Use with client.container(...) to automatically remove the container after the block exits, even if errors occur.
with DockerClient().container("alpine") as container:
container.exec(["echo", "Running inside container"])
# Container is automatically removed
Streaming Image Operations
Methods pull_image, build_image, and push_image, when called with progress=True, return a generator that yields progress updates.
with DockerClient() as client:
# Pull an image with progress
for progress in client.pull_image("alpine:latest", progress=True):
if "status" in progress:
print(f"{progress['status']} {progress.get('progress', '')}")
# Build from directory
for log in client.build_image(".", "my-app:latest", progress=True):
if "stream" in log:
print(log["stream"], end="")
Managing Networks & Volumes
Create and manage Docker networks and volumes using Resource objects.
with DockerClient() as client:
# Networks
net = client.create_network("my-net", driver="bridge")
print(net.id)
net.remove()
# Volumes
vol = client.create_volume("my-data")
print(vol.name)
vol.remove()
File Operations
Copy files and directories in and out of containers directly from the Container object.
with DockerClient() as client:
with client.container("alpine:latest", command="sleep 60") as container:
# Copy host -> container
container.copy_to("local_data/", "/dest/path/")
# Copy container -> host
container.copy_from("/src/path/data.txt", "local_output/")
Real-world Example: Stirling-PDF Conversion
This example demonstrates running a Stirling-PDF container to convert a "Hello World" HTML file into a PDF and then retrieving it.
from bollard import DockerClient
from time import sleep
env = {"SECURITY_ENABLE_LOGIN": "false"}
with DockerClient().container("frooodle/s-pdf", environment=env) as container:
# Wait for the container to be ready
res = ""
while "HTTP" not in res:
res = container.exec("curl -s -I http://localhost:8080")
sleep(1)
# Convert the HTML to PDF
container.exec("sh -c 'echo \"<h1>Test PDF</h1>\" > /test.html'")
result = container.exec(
'curl -s -w "%{http_code}" '
"-F 'fileInput=@/test.html' "
"http://localhost:8080/api/v1/convert/html/pdf "
"-o /test.pdf"
)
# Copy the PDF to the host
container.copy_from("/test.pdf", ".")
Kubernetes YAML Support
Execute Kubernetes YAML files directly using Podman's native play kube feature.
with DockerClient() as client:
# Requires a valid Kubernetes YAML file (Pod, Deployment, etc.)
result = client.play_kube("pod.yaml")
# Returns the JSON response from Podman describing created resources
print("Created Pods:", result.get("Pods"))
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 Distribution
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 bollard-0.1.2.tar.gz.
File metadata
- Download URL: bollard-0.1.2.tar.gz
- Upload date:
- Size: 40.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bafdda1f9d87a5724f837ae0e3c36fc2742de5f440fca71f12222ab52e600a49
|
|
| MD5 |
dc5e03dcf7937878b8371bf9b20b2dfa
|
|
| BLAKE2b-256 |
5aa8d3b375d396bedae2504bae4dccbbdcfcd49bde093aacb13baec945c7d975
|
File details
Details for the file bollard-0.1.2-py3-none-any.whl.
File metadata
- Download URL: bollard-0.1.2-py3-none-any.whl
- Upload date:
- Size: 23.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
690e64510eb99fe777e1330d0d7bd6f5dd421ea4ce3fe884b1bd6f2cdfa9b2ca
|
|
| MD5 |
3d6e92102bd4503d99a0d634c2ea5e1f
|
|
| BLAKE2b-256 |
dbba7a1255d5b1681b69cb94dacbf8370e1e843b01e65ccb8f407a429e1c4444
|