Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/fussybeaver/bollard/llms.txt

Use this file to discover all available pages before exploring further.

Nodes are Engine instances participating in a Docker Swarm. Bollard exposes full node management through the Docker client, allowing you to list, inspect, update availability/role, and delete nodes. All methods are async and return Result<T, bollard::errors::Error>.
Swarm mode must be enabled and the client must connect to a manager node for all node API calls.

list_nodes

Retrieve all nodes visible to the swarm manager, with optional filtering.
pub async fn list_nodes(
    &self,
    options: Option<ListNodesOptions>,
) -> Result<Vec<Node>, Error>

Options — ListNodesOptionsBuilder

Builder methodDescription
.filters(&HashMap<&str, Vec<&str>>)Filter by id, label, membership (accepted | pending), name, or role (manager | worker).

Returns

Result<Vec<Node>, Error>

Example

use bollard::Docker;
use bollard::query_parameters::ListNodesOptionsBuilder;
use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(), bollard::errors::Error> {
    let docker = Docker::connect_with_socket_defaults()?;

    let mut filters = HashMap::new();
    filters.insert("role", vec!["manager"]);

    let options = ListNodesOptionsBuilder::default()
        .filters(&filters)
        .build();

    let nodes = docker.list_nodes(Some(options)).await?;
    for node in &nodes {
        println!("{:?}", node.id);
    }
    Ok(())
}

inspect_node

Fetch detailed information about a single node by its ID or name.
pub async fn inspect_node(
    &self,
    node_name: &str,
) -> Result<Node, Error>

Returns

Result<Node, Error> — a Node model containing id, version, created_at, updated_at, spec, description, and status.

Example

use bollard::Docker;

#[tokio::main]
async fn main() -> Result<(), bollard::errors::Error> {
    let docker = Docker::connect_with_socket_defaults()?;

    let node = docker.inspect_node("my-node-id").await?;
    println!("Hostname: {:?}", node.description
        .as_ref()
        .and_then(|d| d.hostname.as_ref()));
    println!("Status: {:?}", node.status);
    Ok(())
}

delete_node

Remove a node from the swarm. By default this only succeeds for nodes in a down state; pass force: true to remove an active node.
pub async fn delete_node(
    &self,
    node_name: &str,
    options: Option<DeleteNodeOptions>,
) -> Result<(), Error>

Options — DeleteNodeOptionsBuilder

Builder methodTypeDescription
.force(bool)boolForce-remove the node even if it is still active.

Returns

Result<(), Error>

Example

use bollard::Docker;
use bollard::query_parameters::DeleteNodeOptionsBuilder;

#[tokio::main]
async fn main() -> Result<(), bollard::errors::Error> {
    let docker = Docker::connect_with_socket_defaults()?;

    let options = DeleteNodeOptionsBuilder::default()
        .force(true)
        .build();

    docker.delete_node("my-node-id", Some(options)).await?;
    println!("Node removed");
    Ok(())
}
Force-deleting a manager node without first demoting it may reduce manager quorum. Always demote managers with update_node before removing them.

update_node

Change a node’s role or availability. You must supply the current version index to prevent lost-update races.
pub async fn update_node(
    &self,
    node_id: &str,
    spec: NodeSpec,
    options: UpdateNodeOptions,
) -> Result<(), Error>

Options — UpdateNodeOptionsBuilder

Builder methodTypeDescription
.version(i64)i64Required. Current version index from inspect_node.

Key NodeSpec fields

FieldTypeDescription
nameOption<String>Human-readable label for the node.
roleOption<NodeSpecRoleEnum>MANAGER or WORKER.
availabilityOption<NodeSpecAvailabilityEnum>ACTIVE, PAUSE, or DRAIN.
labelsOption<HashMap<String, String>>Arbitrary key/value labels for scheduling constraints.

Returns

Result<(), Error>

Example

use bollard::Docker;
use bollard::query_parameters::UpdateNodeOptionsBuilder;
use bollard::models::{NodeSpec, NodeSpecAvailabilityEnum, NodeSpecRoleEnum};

#[tokio::main]
async fn main() -> Result<(), bollard::errors::Error> {
    let docker = Docker::connect_with_socket_defaults()?;

    let node_id = "my-node-id";

    // Always fetch current version before updating
    let current = docker.inspect_node(node_id).await?;
    let version = current.version.unwrap().index.unwrap();

    let spec = NodeSpec {
        role: Some(NodeSpecRoleEnum::WORKER),
        availability: Some(NodeSpecAvailabilityEnum::DRAIN),
        name: Some("draining-worker".to_string()),
        ..Default::default()
    };

    let options = UpdateNodeOptionsBuilder::default()
        .version(version)
        .build();

    docker.update_node(node_id, spec, options).await?;
    println!("Node drained");
    Ok(())
}
Set availability to DRAIN before removing a worker node. This gracefully reschedules all running tasks to other nodes before the delete.

Build docs developers (and LLMs) love