{"record":{"id":"7454e72e553820b4","repo":"GoogleContainerTools/skaffold","slug":"buildpacks-metadata-has-no-processes","errorCode":null,"errorMessage":"buildpacks metadata has no processes","messagePattern":"buildpacks metadata has no processes","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/debug/cnb.go","lineNumber":123,"sourceCode":"//     found in `/cnb/process/`, and the image entrypoint is set to the corresponding executable for\n//     the default process type.  `CNB_PROCESS_TYPE` is ignored in this situation.  A different process\n//     can be used by overriding the image entrypoint.  Direct and script launches are supported by\n//     setting the entrypoint to `/cnb/lifecycle/launcher` and providing the appropriate arguments.\nfunc updateForCNBImage(adapter types.ContainerAdapter, ic ImageConfiguration, transformer func(adapter types.ContainerAdapter, ic ImageConfiguration) (types.ContainerDebugConfiguration, string, error)) (types.ContainerDebugConfiguration, string, error) {\n\t// buildpacks/lifecycle 0.6.0 embeds the process definitions into a special image label.\n\t// The build metadata isn't absolutely required as the image args could be\n\t// a command line (e.g., `python xxx`) but it likely indicates the\n\t// image was built with an older lifecycle.\n\tmetadataJSON, found := ic.Labels[\"io.buildpacks.build.metadata\"]\n\tif !found {\n\t\treturn types.ContainerDebugConfiguration{}, \"\", fmt.Errorf(\"image is missing buildpacks metadata; perhaps built with older lifecycle?\")\n\t}\n\tm := cnb.BuildMetadata{}\n\tif err := json.Unmarshal([]byte(metadataJSON), &m); err != nil {\n\t\treturn types.ContainerDebugConfiguration{}, \"\", fmt.Errorf(\"unable to parse image buildpacks metadata\")\n\t}\n\tif len(m.Processes) == 0 {\n\t\treturn types.ContainerDebugConfiguration{}, \"\", fmt.Errorf(\"buildpacks metadata has no processes\")\n\t}\n\n\tneedsCnbLauncher := ic.Entrypoint[0] != cnbLauncher\n\t// Rewrites the command-line with cnbLauncher as the entrypoint\n\tic, rewriter := adjustCommandLine(m, ic)\n\n\t// The CNB launcher uses CNB_APP_DIR (defaults to /workspace) and ignores the image's working directory.\n\tif appDir := ic.Env[\"CNB_APP_DIR\"]; appDir != \"\" {\n\t\tic.WorkingDir = appDir\n\t} else {\n\t\tic.WorkingDir = \"/workspace\"\n\t}\n\n\tc, img, err := transformer(adapter, ic)\n\tif err != nil {\n\t\treturn c, img, err\n\t}\n\t// must explicitly modify the working dir as the imageConfig is lost after we return","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/debug/cnb.go#L105-L141","documentation":"Fires in updateForCNBImage when the parsed buildpacks metadata contains no process types, so there is no default process (e.g. 'web') to attach the delve/debug launcher to. The image was built by buildpacks but exposes zero process types in its metadata.","triggerScenarios":"Thrown at pkg/skaffold/debug/cnb.go:123 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild with a buildpack that declares process types, or set an explicit entrypoint/command so a debug target exists","Specify the desired process via CNB_PROCESS_TYPE in the image config where applicable","Skip debug mode for this image if it has no meaningful process to debug"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}