How to pass Docker images between Jobs

Overview

When building an ephemeral Docker image, you may not necessarily want to push to a Docker registry (e.g., Docker Hub). However, you may still want a subsequent job to be able to retrieve this image.

This article shows you how you can pass a built Docker image from one job to another job downstream without needing a Docker registry.

 

Prerequisites

This is achieved by using workspaces, and thus requires that the 2 jobs are in the same workflow.

 

Job A: Save built image as tar file

We can use the `docker image save` command to save an image as a tar file.

jobs:
build_image:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 20.10.18
- run:
name: Build image
command: |
docker image build --tag "acmeorg/foobar:${CIRCLE_SHA1}" .
- run:
name: Save image as tar
command: |
mkdir -p images
docker image save -o "images/acmeorg_foobar_${CIRCLE_SHA1}" "acmeorg/foobar:${CIRCLE_SHA1}"
- persist_to_workspace:
root: .
paths:
- images

 

Job B: Load built image from tar file

We then use the `docker image load` command to load an image via the tar file loaded from the workspace.

jobs:
load_image:
docker:
- image: cimg/base:stable
steps:
- attach_workspace:
at: .
- setup_remote_docker:
version: 20.10.18
- run:
name: Load image
command: |
docker image load < "images/acmeorg_foobar_${CIRCLE_SHA1}"
- run:
name: Inspect loaded image
command: |
# we should see acmeorg/foobar:${CIRCLE_SHA1} listed
docker image ls
- run:
name: Use image
command: |
echo "TODO: run container with image"


We then would combine the 2 jobs in the same workflow.

workflows:
sample:
jobs:
- build_image
- load_image:
requires:
- build_image


Outcome

You should be able to have the built Docker image loaded for use in subsequent jobs in the same workflow.

 

Important Considerations

  • The saved tar files may be large. Loading and saving to workspaces can take time depending on the file sizes.
  • This solution is not applicable for a downstream Docker executor job trying to use this image. For Docker executor jobs, the image must be pulled from an available Docker image registry.

 

Additional Resources: 

Was this article helpful?
25 out of 60 found this helpful

Comments

0 comments

Article is closed for comments.