GoogleContainerTools/skaffold · error

failed to resolve the digest of %s: does the image exist rem

Error message

failed to resolve the digest of %s: does the image exist remotely?

What it means

During Render, when --digest-source=remote, Skaffold resolves each built image tag to a remote registry digest via docker.RemoteDigest. If the digest cannot be fetched, it reports that the tag could not be resolved remotely — usually because the image is not present in the remote registry.

Source

Thrown at pkg/skaffold/runner/render.go:52

)

func (r *SkaffoldRunner) Render(ctx context.Context, out io.Writer, builds []graph.Artifact, offline bool) (manifest.ManifestListByConfig, error) {
	renderOut, postRenderFn, err := util.WithLogFile(time.Now().Format(util.TimeFormat)+".log", out, r.runCtx.Muted())
	if err != nil {
		return manifest.ManifestListByConfig{}, err
	}
	defer postRenderFn()

	eventV2.TaskInProgress(constants.Render, "Render Manifests")
	if r.runCtx.RenderOnly() {
		// Fetch the digest and append it to the tag with the format of "tag@digest"
		if r.runCtx.DigestSource() == constants.RemoteDigestSource {
			for i, a := range builds {
				// remote digest to platform dependant build not supported
				digest, err := docker.RemoteDigest(a.Tag, r.runCtx, nil)
				if err != nil {
					eventV2.TaskFailed(constants.Render, err)
					return manifest.ManifestListByConfig{}, fmt.Errorf("failed to resolve the digest of %s: does the image exist remotely?", a.Tag)
				}
				builds[i].Tag = build.TagWithDigest(a.Tag, digest)
			}
		}
		if r.runCtx.DigestSource() == constants.NoneDigestSource {
			output.Default.Fprintln(out, "--digest-source set to 'none', tags listed in Kubernetes manifests will be used for render")
		}
	}

	ctx, endTrace := instrumentation.StartTrace(ctx, "Render")
	manifestList, err := r.renderer.Render(ctx, renderOut, builds, offline)
	if err != nil {
		eventV2.TaskFailed(constants.Render, err)
		endTrace(instrumentation.TraceEndError(err))
		return manifest.ManifestListByConfig{}, err
	}

	endTrace()

View on GitHub (pinned to a1189de023)

Solutions

  1. Push the images to the remote registry first (or run `skaffold build --push`)
  2. Verify the exact tag exists: `docker manifest inspect <tag>`
  3. Add registry credentials (docker login / credential helper) for private registries
  4. Use --digest-source=local or =none if remote resolution is not required

Example fix

// before
skaffold render --digest-source=remote
// after: ensure images exist or relax digest source
skaffold build --push && skaffold render --digest-source=remote
# or
skaffold render --digest-source=local
Defensive patterns

Strategy: retry

Validate before calling

digest, err := docker.RemoteDigest(tag, runCtx, nil)
if err != nil { return fmt.Errorf("pre-flight: image %s not resolvable: %w", tag, err) }

Try / catch

for attempt := 0; attempt < 3; attempt++ {
    out, err := r.Render(ctx, out, builds, res)
    if err == nil || !strings.Contains(err.Error(), "does the image exist remotely") { return out, err }
    time.Sleep(backoff(attempt))
}
return out, err

Prevention

When it happens

Trigger: Running a render command (Render method) with runCtx.DigestSource() == constants.RemoteDigestSource and docker.RemoteDigest(a.Tag, ...) failing for one of the builds — image not pushed, wrong tag, private registry auth missing, or network/registry outage.

Common situations: Rendering before images were pushed to the registry, typos in image tags, using `skaffold render` in CI without docker/registry credentials, or pointing at a registry that does not contain the built artifacts.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/e827c38c22cc223c. Report an issue: GitHub.