Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Docker Service Buildkite plugin

A Buildkite plugin for running a container alongside your build step. For example to ensure that a local Postgres instance is available in the step that runs your database backend integration tests.


The following step definition will spin up a PostgreSQL container with some default settings. The container will be bound to both the localhost and external network interface of the machine running the build. It will then run the script after which the container is spun down.

  - label: integration-tests
    command: ./
      - improbable-eng/docker-service#v0.3.0:
          container: postgres:12.6
            - --env=POSTGRES_DB=postgres
            - --env=POSTGRES_USER=postgres
            - --env=POSTGRES_PASSWORD=postgres

Advanced usage

Service logs

Any logs generated by the service container over the course of the build will be dumped at the end into the docker-service.logs file. They can then be uploaded as part of the artifacts of your step for later inspection.

Specifying a custom command

You can also specify a specific command to run inside the docker container:

  - label: my-step
    command: ./
      - improbable-eng/docker-service#v0.3.0:
          container: a-container:1.2.3
          cmd: "my-command --flag=value arg1 arg1"

Multi-build network setup

If you have multiple builds running on the same machine they can end up requiring running the same service via the Docker Service plugin. This creates conflicts when those services try to bind to the same host port.

To address this issue use the network option. The plugin will attach the container running your service to the specified docker network. It the network does not yet exist it will be created. The IP of the container running the service will be available to your build via the DOCKER_SERVICE_IP environment variable.

This information can then be used to attach another docker container to the same network and use the service. This would typically require your build step to also run in a docker container, for example by using the Docker Buildkite plugin with its network option.

  - label: my-dockerised-step
      - improbable-eng/docker-service#v0.3.0:
          container: postgres:12.6
          network: "postgres"
            - --env=POSTGRES_DB=postgres
            - --env=POSTGRES_USER=postgres
            - --env=POSTGRES_PASSWORD=postgres
      - buildkite-plugins/docker#v3.8.0:
          container: "my-build-container:v1.0.0"
          command: "./"
          network: "postgres"
          propagate-uid-gid: true
            - DOCKER_SERVICE_IP


Option Required Type Description Default
container Yes string Container image to run n.a
cmd No string Command to run in the container <empty string>
flags No list of strings List of flags for 'docker run' <empty list>
network No string Docker network to which to attach the container host

Environment variables

The plugin will set the following environment variables which will be accessible to your build:

Environment Variable Description
DOCKER_SERVICE_CONTAINER_ID Docker ID of the container running the service.
DOCKER_SERVICE_IP IP at which the service can be reached.


Run separate Docker service containers alongside your primary build command in Buildkite.



Code of conduct