GoogleContainerTools/skaffold · error
writing build output: %w
Error message
writing build output: %w
What it means
In `skaffold build` (cmd/skaffold/app/cmd/build.go:83), when --quiet is set, the rendered build output buffered in memory is written to the command's output stream (out.Write). If that write fails, this error wraps the underlying writer error.
Source
Thrown at cmd/skaffold/app/cmd/build.go:83
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
})
}
func targetArtifacts(opts config.SkaffoldOptions, configs []util.VersionedConfig) []*latest.Artifact {
var targetArtifacts []*latest.Artifact
for _, cfg := range configs {
for _, artifact := range cfg.(*latest.SkaffoldConfig).Build.Artifacts {View on GitHub (pinned to a1189de023)
Solutions
- Avoid piping into commands that exit early, or use `skaffold build --build-output <file>` to write to a file instead
- Check the target of stdout is writable (disk space, fd status)
- Retry the build without --quiet to rule out the quiet-output write path
- If in a pipeline, ensure the consumer reads all output before exiting
Example fix
// before // skaffold build --quiet | head -n1 # head exits, write fails // after // skaffold build --quiet --build-output build.json # write to file instead
Defensive patterns
Strategy: fallback
Validate before calling
// Ensure stdout target is writable before piping build output
if fi, err := os.Stdout.Stat(); err == nil && (fi.Mode()&os.ModeCharDevice) != 0 {
log.Println("writing to terminal; consider --build-output for machines")
} Try / catch
out, err := sh.Command("skaffold", "build", "--quiet", sh.Stdout(nil)).Output()
if err != nil {
if strings.Contains(err.Error(), "writing build output") {
// fall back to writing results to a file instead of stdout
return sh.Run("skaffold", "build", "--quiet", "--build-output", "build.json")
}
return err
} Prevention
- Prefer --build-output <file> over piping stdout in scripts
- Avoid piping into commands that exit early (head, grep -m1)
- In CI, redirect stdout to a file rather than another process
- Monitor disk space where output is redirected
When it happens
Trigger: Running `skaffold build --quiet` where writing rendered build output to stdout (or the configured io.Writer) fails, e.g. broken pipe when piping to a closed reader (`| head`), or an unwritable output target.
Common situations: Piping skaffold build --quiet into `head` or a process that exits early, causing EPIPE; stdout redirected to a full disk or closed file descriptor; CI runner closing the output stream.
Related errors
- executing template: %w
- writing build output to file: %w
- `apply` requires at least one manifest argument
- `exec` requires exactly one action to execute
- `config-dependencies add` requires exactly one file path arg
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/7629cd5e4adcff7c.
Report an issue: GitHub.