GoogleContainerTools/skaffold · error

buildpacks metadata has no processes

Error message

buildpacks metadata has no processes

What it means

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.

Source

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

//     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 {
		return c, img, err
	}
	// must explicitly modify the working dir as the imageConfig is lost after we return

View on GitHub (pinned to a1189de023)

Solutions

  1. Rebuild with a buildpack that declares process types, or set an explicit entrypoint/command so a debug target exists
  2. Specify the desired process via CNB_PROCESS_TYPE in the image config where applicable
  3. Skip debug mode for this image if it has no meaningful process to debug
Defensive patterns

Strategy: validation

When it happens

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

Common situations: See trigger scenarios.


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