{"record":{"id":"e045a604c8147271","repo":"GoogleContainerTools/skaffold","slug":"unable-to-parse-image-buildpacks-metadata","errorCode":null,"errorMessage":"unable to parse image buildpacks metadata","messagePattern":"unable to parse image buildpacks metadata","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/debug/cnb.go","lineNumber":120,"sourceCode":"//     2. If there are no arguments, a process type is taken from the `CNB_PROCESS_TYPE`\n//     environment variable, defaulting to `web`.\n//   - In Platform API 0.4 (pack 0.13 / lifecycle 0.9) the process types are turned into executables\n//     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 {","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/debug/cnb.go#L102-L138","documentation":"Fires in updateForCNBImage when the buildpacks metadata label on the image exists but cannot be parsed into the expected structure — the label content is malformed or in an unexpected format, so the CNB process types cannot be determined for debug configuration.","triggerScenarios":"Thrown at pkg/skaffold/debug/cnb.go:120 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the image with a current, consistent pack CLI and lifecycle version so metadata is well-formed","Inspect the image's buildpacks metadata label (docker inspect) for corruption","Report to skaffold maintainers if a valid modern image still fails to parse"],"exampleFix":null,"handlingStrategy":"try-catch","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"}