GoogleContainerTools/skaffold · warning

STATUSCHECK_CONTAINER_CREATING

STATUSCHECK_CONTAINER_CREATING

Error message

creating container %s

What it means

Raised when a container is in Waiting state with reason ContainerCreating (code STATUSCHECK_CONTAINER_CREATING): the image is pulled/being pulled but the container has not started. Skaffold reports it as a transient creation step, naming the container.

Source

Thrown at pkg/diag/validator/validator.go:365

	case p.isStable():
		return ""
	default:
		if p.ae.Message != "" {
			return p.ae.Message
		}
	}
	return fmt.Sprintf(actionableMessage, p.namespace, p.name)
}

func extractErrorMessageFromWaitingContainerStatus(po *v1.Pod, c v1.ContainerStatus) (proto.StatusCode, []string, error) {
	// Extract meaning full error out of container statuses.
	switch c.State.Waiting.Reason {
	case podInitializing:
		// container is waiting to run. This could be because one of the init containers is
		// still not completed
		return proto.StatusCode_STATUSCHECK_POD_INITIALIZING, nil, nil
	case containerCreating:
		return proto.StatusCode_STATUSCHECK_CONTAINER_CREATING, nil, fmt.Errorf("creating container %s", c.Name)
	case crashLoopBackOff:
		// TODO, in case of container restarting, return the original failure reason due to which container failed.
		sc, l := getPodLogs(po, c.Name, proto.StatusCode_STATUSCHECK_CONTAINER_RESTARTING)
		return sc, l, fmt.Errorf("container %s is backing off waiting to restart", c.Name)
	case ImagePullErr, ImagePullBackOff, ErrImagePullBackOff:
		return proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, nil, fmt.Errorf("container %s is waiting to start: %s can't be pulled", c.Name, c.Image)
	case runContainerError:
		match := runContainerRe.FindStringSubmatch(c.State.Waiting.Message)
		if len(match) != 0 {
			return proto.StatusCode_STATUSCHECK_RUN_CONTAINER_ERR, nil, fmt.Errorf("container %s in error: %s", c.Name, trimSpace(match[3]))
		}
	}
	log.Entry(context.TODO()).Debugf("Unknown waiting reason for container %q: %v", c.Name, c.State)
	return proto.StatusCode_STATUSCHECK_CONTAINER_WAITING_UNKNOWN, nil, fmt.Errorf("container %s in error: %v", c.Name, c.State.Waiting)
}

func newPodStatus(n string, ns string, p string) *podStatus {
	return &podStatus{

View on GitHub (pinned to a1189de023)

Solutions

  1. Wait briefly and re-run — this state is normally transient; use kubectl describe pod to watch Events.
  2. If it hangs for minutes, check kubelet logs and Events for volume-mount or CNI errors and fix the offending plugin/driver.
  3. Pre-pull or reduce image size / use a faster registry or mirror to speed creation.
  4. Verify the node's disk and network aren't saturated by other workloads.
Defensive patterns

Strategy: retry

Validate before calling

if cs.State.Waiting != nil && cs.State.Waiting.Reason == "ContainerCreating" { events, _ := client.CoreV1().Events(ns).List(ctx, eventFor(pod)); checkEventsForVolumeOrCNIErrors(events.Items) }

Type guard

func isContainerCreating(cs v1.ContainerStatus) bool { return cs.State.Waiting != nil && cs.State.Waiting.Reason == "ContainerCreating" }

Try / catch

sc, _, err := getContainerStatus(pod, cs); if sc == proto.StatusCode_STATUSCHECK_CONTAINER_CREATING { if !wait.PollImmediate(2*time.Second, 90*time.Second, func() (bool, error) { return podReady(pod), nil }); return fmt.Errorf("container still creating after 90s: %w", err) }

Prevention

When it happens

Trigger: extractErrorMessageFromWaitingContainerStatus switches on c.State.Waiting.Reason == containerCreating and returns the error; reached from getContainerStatus via getPodStatus.

Common situations: Slow image pulls in CI; kubelet busy setting up volumes/mounts (slow CSI driver, NFS); heavy CNI/network-plugin setup; many pods starting simultaneously; dangling sandbox (pause container) creation delays.

Related errors


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