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
- Validate the custom --build-format template syntax (Go template) and field names against the BuildOutput struct
- Remove the custom --build-format flag to use the default template and confirm the error disappears
- Check the bRes structure for the version of skaffold in use and update template fields accordingly
- 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
- Test custom --build-format templates against a sample build result before CI
- Use the default template unless structured output is truly needed
- Keep templates in sync with the skaffold version's output schema
- Prefer --build-output JSON (stable schema) over free-form templates
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
- writing build output: %w
- writing build output to file: %w
- unsupported template: %s
- setting template flag: %w
- `apply` requires at least one manifest argument
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/7f5c391b1bb5b33f.
Report an issue: GitHub.