GoogleContainerTools/skaffold · error

could not prepare `skaffold filter`: %w

Error message

could not prepare `skaffold filter`: %w

What it means

Wraps helm.PrepareSkaffoldFilter failure when deployRelease sets up the `skaffold filter` post-renderer. The filter binary is used to apply image replacement and debug annotations before user post-renderers run; failure means the binary could not be located/executed or its environment prepared.

Source

Thrown at pkg/skaffold/deploy/helm/helm.go:550

		opts.flags = h.Flags.Install
	} else {
		if r.UpgradeOnChange != nil && !*r.UpgradeOnChange {
			olog.Entry(ctx).Infof("Release %s already installed...", releaseName)
			return nil, []types.Artifact{}, nil
		} else if r.UpgradeOnChange == nil && r.RemoteChart != "" {
			olog.Entry(ctx).Infof("Release %s not upgraded as it is remote...", releaseName)
			return nil, []types.Artifact{}, nil
		}
	}

	installEnv := util.OSEnviron()
	// skaffold use the post-renderer feature to do skaffold specific rendering such as image replacement, adding debugging annotation in helm rendered result,
	// as Helm doesn't support to run multiple post-renderers,  this is used to run user-defined render inside skaffold filter which happens before skaffold
	// post-rendering process for helm releases.
	postRendererFlag := getPostRendererFlag(opts.flags)
	skaffoldBinary, filterEnv, cleanup, err := helm.PrepareSkaffoldFilter(h, builds, postRendererFlag)
	if err != nil {
		return nil, nil, fmt.Errorf("could not prepare `skaffold filter`: %w", err)
	}

	if cleanup != nil {
		defer cleanup()
	}
	// need to include current environment, specifically for HOME to lookup ~/.kube/config
	installEnv = append(installEnv, filterEnv...)

	// Only build local dependencies, but allow a user to skip them.
	if !r.SkipBuildDependencies && r.ChartPath != "" {
		olog.Entry(ctx).Info("Building helm dependencies...")

		args := []string{"dep", "build", r.ChartPath}
		args = append(args, h.Flags.DepBuild...)

		if err := helm.Exec(ctx, h, out, false, nil, args...); err != nil {
			return nil, nil, helm.UserErr("building helm dependencies", err)
		}

View on GitHub (pinned to a1189de023)

Solutions

  1. Run the official skaffold binary directly, not through a renamed wrapper or symlink
  2. Remove conflicting --post-renderer entries from helm.flags (skaffold supplies its own)
  3. Upgrade skaffold; older versions had filter preparation bugs
  4. Set `debug: false` or drop image-transform profiles to confirm the filter is the trigger

Example fix

// before
flags:
  deploy: ["--post-renderer", "my-renderer.sh"]
// after
flags:
  deploy: []   # let skaffold install its own post-renderer chain
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure skaffold is the real binary and no user post-renderer conflicts
if _, err := os.Executable(); err != nil { return err }
for _, f := range opts.flags {
  if strings.HasPrefix(f, "--post-renderer") {
    return fmt.Errorf("remove %s; skaffold installs its own post-renderer", f)
  }
}

Try / catch

if err := deployer.Deploy(ctx, out); err != nil && strings.Contains(err.Error(), "could not prepare `skaffold filter`") {
  // fall back to running deploy without debug/image-replace profile
}

Prevention

When it happens

Trigger: Calling Deploy with debug or profile-driven image replacement enabled when the skaffold binary path cannot be resolved (binary moved/replaced at runtime) or postRendererFlag setup fails.

Common situations: Running skaffold inside a slim container where os.Executable resolves oddly; piping skaffold through wrappers/symlinks; conflicts with a user-defined postRenderer flag in helm.flags.

Related errors


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