An init container is stuck in a ContainerCreating or Init:Error state because it’s failing to complete its task before the main application containers are allowed to start.

Cause 1: Image Pull Failure

The init container’s image cannot be pulled from the registry. This is the most common reason, often due to typos in the image name, incorrect registry credentials, or network issues preventing access to the registry.

  • Diagnosis:

    kubectl describe pod <pod-name> -n <namespace>
    

    Look for events related to Failed to pull image or ErrImagePull.

  • Fix:

    1. Verify Image Name and Tag: Double-check the image: field in your Pod spec for exact spelling and the correct tag.
    2. Check Registry Access: If it’s a private registry, ensure your imagePullSecrets are correctly configured and referenced in the Pod spec.
      spec:
        containers:
        - name: main-app
          image: my-app:latest
        initContainers:
        - name: init-setup
          image: my-private-registry.com/my-init-image:v1.0
        imagePullSecrets:
        - name: my-registry-secret
      
    3. Network Connectivity: Ensure the Kubernetes nodes can reach the container registry. This might involve checking firewall rules or DNS resolution.
  • Why it works: Kubernetes needs to download the container image to the node before it can run the init container. If it can’t get the image, it can’t proceed.

Cause 2: Insufficient Permissions for Image Pull

The Kubernetes cluster’s service account doesn’t have the necessary permissions to pull images from a private registry.

  • Diagnosis:

    kubectl describe pod <pod-name> -n <namespace>
    

    Look for ErrImagePull or ImagePullBackOff with messages indicating authorization failures.

  • Fix: Ensure the service account used by the Pod (or the default service account if none is specified) has a Role or ClusterRole with the get, list, and watch permissions on secrets and pods. More importantly, ensure the imagePullSecrets specified in the Pod manifest are correctly created and contain valid credentials for the private registry.

    kubectl get secret <your-secret-name> -n <namespace> -o yaml
    

    Verify the secret contains username, password, and server (or registry) fields encoded in base64.

  • Why it works: The kubelet on the node uses the credentials provided in the imagePullSecrets to authenticate with the container registry. If these are missing or incorrect, the pull will fail.

Cause 3: Init Container Command/Entrypoint Failure

The command or entrypoint specified in the init container’s image is exiting with a non-zero status code. Init containers must exit with 0 to signal successful completion.

  • Diagnosis:

    kubectl logs <pod-name> -c <init-container-name> -n <namespace>
    

    Examine the logs for error messages indicating why the script or command failed. Also, check the Pod’s status:

    kubectl get pod <pod-name> -n <namespace> -o yaml
    

    The state for the init container will show terminated with a reason and exitCode. A non-zero exitCode means failure.

  • Fix: Modify the init container’s command or entrypoint script to handle errors gracefully and ensure it exits with 0 upon success. For example, if a script is failing, add error handling:

    #!/bin/bash
    set -e # Exit immediately if a command exits with a non-zero status.
    
    # Your initialization logic here
    echo "Running initialization..."
    if ! some_command_that_might_fail; then
        echo "Initialization failed!" >&2
        exit 1 # Explicitly exit with error
    fi
    echo "Initialization complete."
    exit 0 # Explicitly exit with success
    

    If you don’t control the image, you can override the command in the Pod spec:

    spec:
      initContainers:
      - name: init-setup
        image: my-init-image:v1.0
        command: ["/bin/sh", "-c"]
        args:
        - |
          echo "Running overridden init command..."
          # Add logic here to ensure success or handle specific failures
          # Forcing success for demonstration:
          echo "Overridden init succeeded."
          exit 0
    
  • Why it works: Kubernetes waits for init containers to successfully complete (exit code 0) before starting the application containers. If the init container’s process fails, Kubernetes marks the Pod as failed.

Cause 4: Resource Constraints (CPU/Memory)

The init container requires more CPU or memory than is allocated to it by the Pod’s resource requests, or the node it’s scheduled on doesn’t have enough available resources.

  • Diagnosis:

    kubectl describe pod <pod-name> -n <namespace>
    

    Look for events related to OOMKilled (Out Of Memory) or FailedScheduling if the Pod can’t even be placed on a node.

    kubectl top pod <pod-name> -n <namespace> --containers
    

    This command, if metrics-server is installed, can show actual resource usage. Compare this to the resources: section in your Pod spec.

  • Fix: Increase the resources.requests and resources.limits for CPU and memory in the init container’s spec.

    spec:
      containers:
      - name: main-app
        image: my-app:latest
      initContainers:
      - name: init-setup
        image: my-init-image:v1.0
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "200m"
    

    If the issue is node-level scarcity, you might need to scale up your cluster or use node affinity/taints to schedule the Pod on nodes with more available resources.

  • Why it works: If an init container exceeds its memory limit, the kernel will terminate it (OOMKill). If it’s starved of CPU, it might take so long that other timeouts occur, or it simply can’t perform its task. Properly sized requests ensure Kubernetes schedules it on a node with sufficient capacity.

Cause 5: Volume Mounting Issues

The init container needs to mount a volume (e.g., for configuration files, secrets, or shared data), but the volume is not available, is misconfigured, or the init container lacks permissions to access it.

  • Diagnosis:

    kubectl describe pod <pod-name> -n <namespace>
    

    Check events for errors related to volume mounting, such as MountVolume.SetUp failed. Also, inspect the kubectl logs <pod-name> -c <init-container-name> -n <namespace> for errors related to file access within the container.

  • Fix:

    1. Verify Volume Definition: Ensure the volume is correctly defined in the Pod spec and matches the volumeMounts in the init container.
    2. Check Underlying Storage: If using PersistentVolumes (PVs), ensure the PV and PersistentVolumeClaim (PVC) are bound and the underlying storage is healthy and accessible by the node.
    3. Permissions: If mounting secrets or configmaps, ensure the init container has the necessary read permissions for the files within the mounted volume. For hostPath volumes, ensure the path exists on the node and has appropriate permissions.
      spec:
        volumes:
        - name: config-volume
          configMap:
            name: my-config
        initContainers:
        - name: init-setup
          image: my-init-image:v1.0
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
            readOnly: true
      
  • Why it works: Init containers often prepare the environment for the main application. If they can’t access or write necessary data to volumes, they cannot complete their setup task.

Cause 6: Network Configuration / DNS Issues

The init container needs to perform network operations (e.g., reach a database, call an external API, resolve DNS) but cannot due to network policies, DNS misconfiguration, or CNI (Container Network Interface) problems.

  • Diagnosis:

    kubectl logs <pod-name> -c <init-container-name> -n <namespace>
    

    Look for errors like Name or service not known, connection refused, or timeout.

    kubectl exec <pod-name> -c <init-container-name> -n <namespace> -- nslookup kubernetes.default
    

    Test basic DNS resolution within the init container.

  • Fix:

    1. Network Policies: Review NetworkPolicy resources in the namespace that might be restricting egress traffic from the Pod.
    2. DNS Configuration: Ensure the cluster’s DNS is functioning correctly (e.g., CoreDNS pods are running and healthy). Check /etc/resolv.conf inside the container for correct nameserver entries.
    3. CNI Plugin: Verify the CNI plugin (e.g., Calico, Flannel, Cilium) is correctly installed and operational on the nodes.
    4. Service Discovery: Ensure any Kubernetes Services the init container needs to reach are correctly defined and accessible.
  • Why it works: Many initialization tasks require connectivity to other services or the internet. If network rules or underlying infrastructure prevent this, the init container will fail.

The next error you’ll likely encounter after fixing init container issues is a CrashLoopBackOff on your main application container, indicating it started but then failed.

Want structured learning?

Take the full Kubernetes course →