GoogleContainerTools/skaffold · error

could not prepare `skaffold filter`: %w

Error message

could not prepare `skaffold filter`: %w

What it means

generateHelmManifests calls helm.PrepareSkaffoldFilter to set up the `skaffold filter` binary and environment used as a Helm post-renderer when builds exist. Failures (locating the skaffold binary, writing the filter config/env) are wrapped as 'could not prepare `skaffold filter`'.

Source

Thrown at pkg/skaffold/render/renderer/helm/helm.go:142

		"RendererType": "helm",
	})

	manifests, err := h.generateHelmManifests(ctx, builds)
	endTrace()
	manifestListByConfig := manifest.NewManifestListByConfig()
	manifestListByConfig.Add(h.configName, manifests)
	return manifestListByConfig, err
}

func (h Helm) generateHelmManifests(ctx context.Context, builds []graph.Artifact) (manifest.ManifestList, error) {
	var renderedManifests manifest.ManifestList
	helmEnv := sUtil.OSEnviron()
	var postRendererArgs []string

	if len(builds) > 0 {
		skaffoldBinary, filterEnv, cleanup, err := helm.PrepareSkaffoldFilter(h, builds, []string{})
		if err != nil {
			return nil, fmt.Errorf("could not prepare `skaffold filter`: %w", err)
		}
		defer cleanup()

		// need to include current environment, specifically for HOME to lookup ~/.kube/config
		helmEnv = append(helmEnv, filterEnv...)

		var cleanUpPostRenderer func()
		cleanUpPostRenderer, postRendererArgs, err = helm.PreparePostRenderer(ctx, h, skaffoldBinary, h.helmVersion)
		if err != nil {
			return nil, err
		}
		if cleanUpPostRenderer != nil {
			defer cleanUpPostRenderer()
		}
	}

	for _, release := range h.config.Releases {
		m, err := h.generateHelmManifest(ctx, builds, release, helmEnv, postRendererArgs)

View on GitHub (pinned to a1189de023)

Solutions

  1. Run the skaffold binary directly from an installed path (not via go run or a symlinked shim)
  2. Ensure TMPDIR is writable and has space so the filter setup can create its files
  3. Check the underlying wrapped error for which preparation step failed (binary lookup vs env files)
  4. As a workaround, run `skaffold render` without builds (or upgrade Skaffold if a known bug matches)

Example fix

// before: invoked via an unofficial wrapper
$ my-skaffold-wrapper render
// after
$ skaffold render
Defensive patterns

Strategy: fallback

Validate before calling

exe, err := os.Executable(); err == nil && fileExists(exe) || echo 'skaffold binary not resolvable for post-renderer'

Try / catch

if err != nil && strings.Contains(err.Error(), "could not prepare `skaffold filter`") {
    // fall back to rendering without builds, or run the installed skaffold binary directly
}

Prevention

When it happens

Trigger: Running render with a helm renderer and at least one build artifact (len(builds) > 0), causing helm.PrepareSkaffoldFilter(h, builds, []string{}) to fail — typically because it can't resolve the current skaffold binary path or create its filter setup files.

Common situations: Skaffold executed via a wrapper (go run, shim, container) where os.Executable is unreliable; restricted temp dir prevents writing the filter artifacts; unusual binary rename or PATH setup in CI.

Related errors


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