{"record":{"id":"7629cd5e4adcff7c","repo":"GoogleContainerTools/skaffold","slug":"writing-build-output-w","errorCode":null,"errorMessage":"writing build output: %w","messagePattern":"writing build output: %w","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/skaffold/app/cmd/build.go","lineNumber":83,"sourceCode":"func doBuild(ctx context.Context, out io.Writer) error {\n\tbuildOut := out\n\tif quietFlag {\n\t\tbuildOut = io.Discard\n\t}\n\n\treturn withRunner(ctx, out, func(r runner.Runner, configs []util.VersionedConfig) error {\n\t\tbRes, err := r.Build(ctx, buildOut, targetArtifacts(opts, configs))\n\n\t\tif quietFlag || buildOutputFlag != \"\" {\n\t\t\tcmdOut := flags.BuildOutput{Builds: bRes}\n\t\t\tvar buildOutput bytes.Buffer\n\t\t\tif err := buildFormatFlag.Template().Execute(&buildOutput, cmdOut); err != nil {\n\t\t\t\treturn fmt.Errorf(\"executing template: %w\", err)\n\t\t\t}\n\n\t\t\tif quietFlag {\n\t\t\t\tif _, err := out.Write(buildOutput.Bytes()); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"writing build output: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif buildOutputFlag != \"\" {\n\t\t\t\tif err := os.WriteFile(buildOutputFlag, buildOutput.Bytes(), 0644); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"writing build output to file: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn err\n\t})\n}\n\nfunc targetArtifacts(opts config.SkaffoldOptions, configs []util.VersionedConfig) []*latest.Artifact {\n\tvar targetArtifacts []*latest.Artifact\n\tfor _, cfg := range configs {\n\t\tfor _, artifact := range cfg.(*latest.SkaffoldConfig).Build.Artifacts {","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/cmd/skaffold/app/cmd/build.go#L65-L101","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\n// skaffold build --quiet | head -n1   # head exits, write fails\n// after\n// skaffold build --quiet --build-output build.json  # write to file instead","handlingStrategy":"fallback","validationCode":"// Ensure stdout target is writable before piping build output\nif fi, err := os.Stdout.Stat(); err == nil && (fi.Mode()&os.ModeCharDevice) != 0 {\n    log.Println(\"writing to terminal; consider --build-output for machines\")\n}","typeGuard":null,"tryCatchPattern":"out, err := sh.Command(\"skaffold\", \"build\", \"--quiet\", sh.Stdout(nil)).Output()\nif err != nil {\n    if strings.Contains(err.Error(), \"writing build output\") {\n        // fall back to writing results to a file instead of stdout\n        return sh.Run(\"skaffold\", \"build\", \"--quiet\", \"--build-output\", \"build.json\")\n    }\n    return err\n}","preventionTips":["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"],"tags":["cli","build","stdout","broken-pipe"],"backgroundTag":"broken-pipe","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}