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

  1. Avoid piping into commands that exit early, or use `skaffold build --build-output <file>` to write to a file instead
  2. Check the target of stdout is writable (disk space, fd status)
  3. Retry the build without --quiet to rule out the quiet-output write path
  4. 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

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


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