GoogleContainerTools/skaffold · error

executing template: %w

Error message

executing template: %w

What it means

In the `skaffold build` command (cmd/skaffold/app/cmd/build.go:78), when --quiet or --build-output is used, the build results are rendered through the build format template (buildFormatFlag.Template().Execute). If template execution fails, this error wraps the underlying template error.

Source

Thrown at cmd/skaffold/app/cmd/build.go:78

		}).
		WithHouseKeepingMessages().
		NoArgs(doBuild)
}

func doBuild(ctx context.Context, out io.Writer) error {
	buildOut := out
	if quietFlag {
		buildOut = io.Discard
	}

	return withRunner(ctx, out, func(r runner.Runner, configs []util.VersionedConfig) error {
		bRes, err := r.Build(ctx, buildOut, targetArtifacts(opts, configs))

		if quietFlag || buildOutputFlag != "" {
			cmdOut := flags.BuildOutput{Builds: bRes}
			var buildOutput bytes.Buffer
			if err := buildFormatFlag.Template().Execute(&buildOutput, cmdOut); err != nil {
				return fmt.Errorf("executing template: %w", err)
			}

			if quietFlag {
				if _, err := out.Write(buildOutput.Bytes()); err != nil {
					return fmt.Errorf("writing build output: %w", err)
				}
			}

			if buildOutputFlag != "" {
				if err := os.WriteFile(buildOutputFlag, buildOutput.Bytes(), 0644); err != nil {
					return fmt.Errorf("writing build output to file: %w", err)
				}
			}
		}

		return err
	})
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Validate the custom --build-format template syntax (Go template) and field names against the BuildOutput struct
  2. Remove the custom --build-format flag to use the default template and confirm the error disappears
  3. Check the bRes structure for the version of skaffold in use and update template fields accordingly
  4. Ensure the build itself succeeded (r.Build's err is handled later); template runs even on results only when quiet/output is set

Example fix

// before
// skaffold build --quiet --build-format '{{.Builds.Image}}'
// after (Builds is a slice; range over it)
// skaffold build --quiet --build-format '{{range .Builds}}{{.ImageName}}{{end}}'
Defensive patterns

Strategy: validation

Validate before calling

// Pre-validate a custom build format template by rendering a dummy BuildOutput
tmpl, err := template.New("out").Parse(customFormat)
if err != nil {
    return fmt.Errorf("invalid --build-format template: %w", err)
}
if err := tmpl.Execute(io.Discard, flags.BuildOutput{}); err != nil {
    return fmt.Errorf("template incompatible with BuildOutput: %w", err)
}

Try / catch

if err := sh.Run("skaffold", "build", "--quiet", "--build-format", format); err != nil {
    if strings.Contains(err.Error(), "executing template") {
        log.Fatalf("bad --build-format %q; check Go template syntax and field names", format)
    }
    return err
}

Prevention

When it happens

Trigger: Running `skaffold build --quiet` or `skaffold build --build-output <file>` with a --build-format template that fails to execute against the flags.BuildOutput{Builds: bRes} data (invalid template syntax, referencing a non-existent field, bad custom template).

Common situations: User-supplied --build-format Go template with a typo or unsupported field; incompatible template written for an older skaffold output schema; malformed JSON/GOTEMPLATE value passed to --build-format.

Related errors


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