Skip to content

Docker Builder

Docker Builder is a way for Open Source projects to build and publish Docker Images to Docker Registries of their choice. In essence, a docker_builder is basically a task that is executed in a VM with pre-installed Docker. docker_builder can be defined the same way as a task:

  build_script: docker build --tag myrepo/foo:latest .

Leveraging features like Task Dependencies, Conditional Execution and Encrypted Variables with a Docker Builder can help building some pretty complex pipelines.

In the example below, a docker_builder will be only executed on a tag creation, once both test and lint tasks have finished successfully:

test_task: ...
lint_task: ...

  only_if: $CIRRUS_TAG != ''
    - test
    - lint
  build_script: docker build --tag myrepo/foo:$CIRRUS_TAG .
  login_script: docker login --username $DOCKER_USERNAME --password $DOCKER_PASSWORD
  push_script: docker push myrepo/foo:$CIRRUS_TAG


For more examples please check how we use Docker Builder to build and publish Cirrus CI's Docker Images for Android.

Layer Caching

Docker has --cache-from flag which allows to use a previously built image as a cache source. This way only changed layers will be rebuilt which can drastically improve performance of build_script. Here is a snippet that uses --cache-from flag:

# pull an image if available
docker pull myrepo/foo:latest || true
docker build --cache-from myrepo/foo:latest \
  --tag myrepo/foo:$CIRRUS_TAG \
  --tag myrepo/foo:latest .