GoogleContainerTools/skaffold · error

unable to parse image buildpacks metadata

Error message

unable to parse image buildpacks metadata

What it means

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.

Source

Thrown at pkg/skaffold/debug/cnb.go:120

//     2. If there are no arguments, a process type is taken from the `CNB_PROCESS_TYPE`
//     environment variable, defaulting to `web`.
//   - In Platform API 0.4 (pack 0.13 / lifecycle 0.9) the process types are turned into executables
//     found in `/cnb/process/`, and the image entrypoint is set to the corresponding executable for
//     the default process type.  `CNB_PROCESS_TYPE` is ignored in this situation.  A different process
//     can be used by overriding the image entrypoint.  Direct and script launches are supported by
//     setting the entrypoint to `/cnb/lifecycle/launcher` and providing the appropriate arguments.
func updateForCNBImage(adapter types.ContainerAdapter, ic ImageConfiguration, transformer func(adapter types.ContainerAdapter, ic ImageConfiguration) (types.ContainerDebugConfiguration, string, error)) (types.ContainerDebugConfiguration, string, error) {
	// buildpacks/lifecycle 0.6.0 embeds the process definitions into a special image label.
	// The build metadata isn't absolutely required as the image args could be
	// a command line (e.g., `python xxx`) but it likely indicates the
	// image was built with an older lifecycle.
	metadataJSON, found := ic.Labels["io.buildpacks.build.metadata"]
	if !found {
		return types.ContainerDebugConfiguration{}, "", fmt.Errorf("image is missing buildpacks metadata; perhaps built with older lifecycle?")
	}
	m := cnb.BuildMetadata{}
	if err := json.Unmarshal([]byte(metadataJSON), &m); err != nil {
		return types.ContainerDebugConfiguration{}, "", fmt.Errorf("unable to parse image buildpacks metadata")
	}
	if len(m.Processes) == 0 {
		return types.ContainerDebugConfiguration{}, "", fmt.Errorf("buildpacks metadata has no processes")
	}

	needsCnbLauncher := ic.Entrypoint[0] != cnbLauncher
	// Rewrites the command-line with cnbLauncher as the entrypoint
	ic, rewriter := adjustCommandLine(m, ic)

	// The CNB launcher uses CNB_APP_DIR (defaults to /workspace) and ignores the image's working directory.
	if appDir := ic.Env["CNB_APP_DIR"]; appDir != "" {
		ic.WorkingDir = appDir
	} else {
		ic.WorkingDir = "/workspace"
	}

	c, img, err := transformer(adapter, ic)
	if err != nil {

View on GitHub (pinned to a1189de023)

Solutions

  1. Rebuild the image with a current, consistent pack CLI and lifecycle version so metadata is well-formed
  2. Inspect the image's buildpacks metadata label (docker inspect) for corruption
  3. Report to skaffold maintainers if a valid modern image still fails to parse
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at pkg/skaffold/debug/cnb.go:120 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


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