1.13.3.2 Building an Image and Using it in a Task

This guide will show you how to build and use an image within one job without pushing the image to an external image registry like Docker Hub.

Build The Image

To avoid repeating ourselves we're going to use the pipeline made in the other guide Building and Pushing an Image. We will start with the pipeline from the Defining the Build Context section.

We will add the UNPACK_ROOTFS parameter to the task. This paramter tells the oci-build-task to include the image in a special format that Concourse's container runtime uses. In the future this may not be necessary if Concourse starts using the OCI image format.

build-and-use-image.yml
resources:
# The repo with our Dockerfile
- name: concourse-examples
  type: git
  icon: github
  source:
    uri: https://github.com/concourse/examples.git
    branch: master

jobs:
- name: build-and-run
  plan:
  - get: concourse-examples
  - task: build-image
    privileged: true # oci-build-task must run in a privileged container
    config:
      platform: linux
      image_resource:
        type: registry-image
        source:
          repository: concourse/oci-build-task
      inputs:
      - name: concourse-examples
      outputs:
      - name: image
      params:
        CONTEXT: concourse-examples/Dockerfiles/simple
        UNPACK_ROOTFS: true #add this param
      run: # binary used to build the image
        path: build

The above pipeline will build a container image and also output it in Concourse's rootfs image format.

Use the Image

Next we want to add a second task to this job which will use the image generated from the first task as its container image. To use the image from the previous step add the top-level image key to the task step.

build-and-use-image.yml
resources: ...  # omitting for brevity

jobs:
- name: build-and-run
  plan:
  - get: concourse-examples
  - task: build-image
    privileged: true
    config:
      platform: linux
      image_resource:
        type: registry-image
        source:
          repository: concourse/oci-build-task
      inputs:
      - name: concourse-examples
      outputs:
      - name: image
      params:
        CONTEXT: concourse-examples/Dockerfiles/simple
        UNPACK_ROOTFS: true
      run:
        path: build
  - task: use-built-image-in-task  # add a new task step
    image: image  # using the image built in the previous step
    config:
      platform: linux
      run:
        path: cat
        args: ["/stranger"]

You can set the pipeline with the following fly command.

fly -t <target> set-pipeline -p build-and-use-image \
  -c ./build-and-use-image.yml \