#docker #async-api #api-version #buildkit #http-api #daemon #api-client

bollard-next

An asynchronous Docker daemon API

21 releases

0.18.1 Oct 19, 2024
0.16.1 May 1, 2024
0.15.7 Dec 29, 2023
0.15.4 Oct 11, 2023
0.14.3 Mar 15, 2023

#74 in Network programming

Download history 92/week @ 2024-07-30 72/week @ 2024-08-06 67/week @ 2024-08-13 78/week @ 2024-08-20 61/week @ 2024-08-27 165/week @ 2024-09-03 154/week @ 2024-09-10 149/week @ 2024-09-17 288/week @ 2024-09-24 150/week @ 2024-10-01 121/week @ 2024-10-08 418/week @ 2024-10-15 487/week @ 2024-10-22 477/week @ 2024-10-29 312/week @ 2024-11-05 292/week @ 2024-11-12

1,682 downloads per month
Used in 7 crates

Apache-2.0

500KB
9K SLoC

crates.io license circle-ci appveyor docs

Bollard: an asynchronous rust client library for the docker API

Bollard leverages the latest Hyper and Tokio improvements for an asynchronous API containing futures, streams and the async/await paradigm.

This library features Windows support through Named Pipes and HTTPS support through optional Rustls bindings. Serialization types for interfacing with Docker and Buildkit are generated through OpenAPI, protobuf and upstream documentation.

Install

Add the following to your Cargo.toml file

[dependencies]
bollard = "*"

API

Documentation

API docs.

Latest

Version 0.17 enables the secrets and sshforward components of buildkit, API version 1.45.0 - (disabled for windows). Please note: all buildkit API's are under developer preview, feedback is encouraged.

Feature flags

  • ssl: enable SSL support through Rustls with the ring provider.
  • aws-lc-rs: enable SSL support through Rustls with the aws-lc-rs provider.
  • ssl_providerless: enable SSL support through Rustls without installing a CryptoProvider. You are responsible to do so.
  • chrono: enable Chrono for DateTime types.
  • time: enable Time 0.3 for DateTime types.
  • buildkit: use Buildkit instead of Docker when building images.
  • json_data_content: Add JSON to errors on serialization failures.
  • webpki: Use mozilla's root certificates instead of native root certs provided by the OS.

Version

The Docker API used by Bollard is using the latest 1.44 documentation schema published by the moby project to generate its serialization interface.

Breaking change releases in Bollard will depend on a moby API server version corresponding to the date of that release, so for example a January minor version change will use the matching moby swagger API available in January. The associated bollard-stubs project will release separate versions that you can pin your project against, if you need a more modern or older API according to your docker server version.

For example:

[dependencies]
bollard-stubs = { version = "=1.44.0-rc.26.0.0" }

This library also supports version negotiation, to allow downgrading to an older API version.

Usage

Connecting with the docker daemon

Connect to the docker server according to your architecture and security remit.

Socket

The client will connect to the standard unix socket location /var/run/docker.sock or Windows named pipe location //./pipe/docker_engine.

use bollard_next::Docker;
#[cfg(unix)]
Docker::connect_with_socket_defaults();

Use the Docker::connect_with_socket method API to parameterise this interface.

Local

The client will connect to the OS specific handler it is compiled for.

This is a convenience for localhost environment that should run on multiple operating systems.

use bollard_next::Docker;
Docker::connect_with_local_defaults();

Use the Docker::connect_with_local method API to parameterise this interface.

HTTP

The client will connect to the location pointed to by DOCKER_HOST environment variable, or localhost:2375 if missing.

use bollard_next::Docker;
Docker::connect_with_http_defaults();

Use the Docker::connect_with_http method API to parameterise the interface.

SSL via Rustls

The client will connect to the location pointed to by DOCKER_HOST environment variable, or localhost:2375 if missing.

The location pointed to by the DOCKER_CERT_PATH environment variable is searched for certificates - key.pem for the private key, cert.pem for the server certificate and ca.pem for the certificate authority chain.

use bollard_next::Docker;
#[cfg(feature = "ssl")]
Docker::connect_with_ssl_defaults();

Use the Docker::connect_with_ssl method API to parameterise the interface.

Examples

Note: all these examples need a Tokio Runtime.

Version

First, check that the API is working with your server:

use bollard_next::Docker;

use futures_util::future::FutureExt;

// Use a connection function described above
// let docker = Docker::connect_...;

async move {
    let version = docker.version().await.unwrap();
    println!("{:?}", version);
};

Listing images

To list docker images available on the Docker server:

use bollard_next::Docker;
use bollard_next::image::ListImagesOptions;

use futures_util::future::FutureExt;

use std::default::Default;

// Use a connection function described above
// let docker = Docker::connect_...;

async move {
    let images = &docker.list_images(Some(ListImagesOptions::<String> {
        all: true,
        ..Default::default()
    })).await.unwrap();

    for image in images {
        println!("-> {:?}", image);
    }
};

Streaming Stats

To receive a stream of stats for a running container.

use bollard_next::Docker;
use bollard_next::container::StatsOptions;

use futures_util::stream::TryStreamExt;

use std::default::Default;

// Use a connection function described above
// let docker = Docker::connect_...;

async move {
    let stats = &docker.stats("postgres", Some(StatsOptions {
       stream: true,
       ..Default::default()
    })).try_collect::<Vec<_>>().await.unwrap();

    for stat in stats {
        println!("{} - mem total: {:?} | mem usage: {:?}",
            stat.name,
            stat.memory_stats.max_usage,
            stat.memory_stats.usage);
    }
};

Examples

Further examples are available in the examples folder, or the integration/unit tests.

Development

Contributions are welcome, please observe the following.

Building the proto models

Serialization models for the buildkit feature are generated through the Tonic library. To generate these files, use the following in the codegen/proto folder:

cargo run --bin gen --features build

Building the swagger models

Serialization models are generated through the Swagger library. To generate these files, use the following in the codegen/swagger folder:

mvn -D org.slf4j.simpleLogger.defaultLogLevel=error compiler:compile generate-resources

Integration tests

Running the integration tests by default requires a running docker registry, with images tagged and pushed there. To disable this behaviour, set the DISABLE_REGISTRY environment variable.

docker run -d --restart always --name registry -p 5000:5000 registry:2
docker pull hello-world:linux
docker pull fussybeaver/uhttpd
docker pull alpine
docker tag hello-world:linux localhost:5000/hello-world:linux
docker tag fussybeaver/uhttpd localhost:5000/fussybeaver/uhttpd
docker tag alpine localhost:5000/alpine
docker push localhost:5000/hello-world:linux
docker push localhost:5000/fussybeaver/uhttpd
docker push localhost:5000/alpine
docker swarm init
REGISTRY_HTTP_ADDR=localhost:5000 cargo test -- --test-threads 1

License: Apache-2.0

Dependencies

~11–24MB
~335K SLoC