{"record":{"id":"b061c153c83c6690","repo":"GoogleContainerTools/skaffold","slug":"running-post-renderer-w","errorCode":null,"errorMessage":"running post-renderer: %w","messagePattern":"running post-renderer: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/skaffold/app/cmd/filter.go","lineNumber":78,"sourceCode":"\t\t\t{Value: &postRenderer, Name: \"post-renderer\", DefValue: \"\", FlagAddMethod: \"StringVar\", Usage: \"Any executable that accepts rendered Kubernetes manifests on STDIN and returns valid Kubernetes manifests on STDOUT\"},\n\t\t}).\n\t\tNoArgs(func(ctx context.Context, out io.Writer) error {\n\t\t\treturn doFilter(ctx, out, debuggingFilters, postRenderer, renderFromBuildOutputFile.BuildArtifacts())\n\t\t})\n}\n\n// runFilter loads the Kubernetes manifests from stdin and applies the debug transformations.\n// Unlike `skaffold debug`, this filtering affects all images and not just the built artifacts.\nfunc runFilter(ctx context.Context, out io.Writer, debuggingFilters bool, postRenderer string, buildArtifacts []graph.Artifact) error {\n\treturn withRunner(ctx, out, func(r runner.Runner, configs []util.VersionedConfig) error {\n\t\tvar manifestList manifest.ManifestList\n\t\tvar err error\n\t\tif postRenderer != \"\" {\n\t\t\tcmd := exec.CommandContext(ctx, postRenderer)\n\t\t\tcmd.Stdin = os.Stdin\n\t\t\tstdoutPipe, err := cmd.StdoutPipe()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"running post-renderer: %w\", err)\n\t\t\t}\n\t\t\terr = cmd.Start()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"running post-renderer: %w\", err)\n\t\t\t}\n\n\t\t\tmanifestList, err = manifest.Load(stdoutPipe)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"loading post-renderer result: %w\", err)\n\t\t\t}\n\t\t\tstdoutPipe.Close()\n\t\t} else {\n\t\t\tmanifestList, err = manifest.Load(os.Stdin)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"loading manifests: %w\", err)\n\t\t}\n\t\tvar ass applysetters.ApplySetters","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/cmd/skaffold/app/cmd/filter.go#L60-L96","documentation":"Wraps a failure from cmd.StdoutPipe() when setting up stdout piping for the post-renderer process in `skaffold filter --post-renderer`. The post-renderer is an external command whose stdout is read as rendered manifests.","triggerScenarios":"exec.CommandContext(postRenderer) is configured with StdoutPipe() and that call returns a non-nil error (pipe creation failure), wrapped at filter.go:78.","commonSituations":"Extremely rare; typically process resource exhaustion (too many open file descriptors) prevents creating the pipe.","solutions":["Check the wrapped error for fd/pipe exhaustion","Raise the process file-descriptor limit (ulimit -n)","Verify the environment allows spawning processes","Retry the filter command once resources are freed"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil {\n    return fmt.Errorf(\"running post-renderer: %w\", err)\n}\n// caller: log %v of the wrapped error; retry once if it is a transient resource error","preventionTips":["Avoid exhausting file descriptors before running skaffold filter","Keep the post-renderer setup simple; prefer cmd.Start error handling (error 92) awareness"],"tags":["cli","exec","pipe","post-renderer"],"backgroundTag":"post-renderer-exec-failed","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"}