Defining dependencies between artifacts

This page describes how to define dependencies between artifacts and reference them in the docker builder.

Before you begin

First, you will need to have Skaffold and a Kubernetes cluster set up. To learn more about how to set up Skaffold and a Kubernetes cluster, see the quickstart docs.

Tutorial - Simple artifact dependency

This tutorial will be based on the simple-artifact-dependency example in our repository.

Adding an artifact dependency

We have a base artifact which has a single Dockerfile that we build with the docker builder:

FROM alpine:3
COPY hello.txt .
CMD ["./app"]

This artifact is used as the base image for the app artifact. We express this dependency in the skaffold.yaml using the requires expression.

apiVersion: skaffold/v2beta9
kind: Config
build:
  artifacts:
  - image: app
    context: app
    requires:
    - image: base
      alias: BASE
  - image: base
    context: base

The image alias BASE is now available as a build-arg in the Dockerfile for app:

ARG BASE
FROM golang:1.15-alpine as builder
...
FROM $BASE
COPY --from=builder /app .

Build and Deploy

In the simple-artifact-dependency directory, run:

skaffold dev

If this is the first time you’re running this, then it should build the artifacts, starting with base and later app. Skaffold can handle any arbitrary dependency graph between artifacts and schedule builds in the right order. It’ll also report an error if it detects dependency cycles or self-loops.

Checking cache...
 - base: Not found. Building
 - app: Not found. Building

Building [base]...
<docker build logs here>

Building [app]...
<docker build logs here>

It will then deploy a single container pod, while also monitoring for file changes.

Watching for changes...
[simple-artifact-dependency-app] Hello World
[simple-artifact-dependency-app] Hello World

Modify the text in file base/hello.txt to something else instead:

Hello World!!!

This will trigger a rebuild for the base artifact, and since app artifact depends on base it’ll also trigger a rebuild for that. After deployment stabilizes, it should now show the logs reflecting this change:

Watching for changes...
[simple-artifact-dependency-app] Hello World!!!
[simple-artifact-dependency-app] Hello World!!!

Cleanup

Hitting Ctrl + C on a running Skaffold process should end it and cleanup its deployments. If there are still persisting objects then you can issue skaffold delete command to attempt the cleanup again.