argoproj/argo-workflows · critical

Artifact driver validation failed: The following artifact…

Error message

Artifact driver validation failed: The following artifact driver images are not present in the server pod: %v. Please ensure all artifact driver images are included in the argo-server pod.

What it means

At startup the argo-server validates that the container images required by each configured artifact driver are actually present in the server pod (via the pod spec/status). If one or more driver images are missing, it returns this error and refuses to start, since artifact operations would fail at runtime.

Solutions

  1. Inspect the image list in the error and add the missing image(s) to the argo-server pod spec (Helm values / kustomize patch).
  2. Use the official argo-server image for the release, which includes all expected driver images.
  3. Disable/remove drivers from config that you don't use so their images aren't required.
  4. If using a custom image, rebuild it including all driver images required by your configuration.

Example fix

// before: custom server pod spec without driver images
containers:
  - name: argo-server
    image: my-registry/argo-server-slim:v4
// after: include the required driver images
initContainers/containers += images reported missing, e.g.
  - name: argo-server
    image: quay.io/argoproj/argocli:v4.0.0
Defensive patterns

Strategy: validation

Validate before calling

// verify the argo-server image includes required driver images before rollout
imgs, _ := clientset.CoreV1().Pods(ns).Get(ctx, "argo-server", metav1.GetOptions{})
_ = imgs // compare pod spec images against the driver list in the error before upgrading

Prevention

When it happens

Trigger: Starting argo-server where cfg.ArtifactDrivers lists drivers whose expected sidecar/init images are not among the pod's images — e.g. custom argo-server images that dropped driver images, trimmed distributions, or config enabling a driver whose image was never added to the pod template.

Common situations: Building a slim/custom argo-server image without all driver images baked in; upgrading Argo and the new driver images weren't added to the Helm/Kustomize pod spec; enabling an experimental driver in config on a stock deployment that doesn't ship it.

Related errors


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/083360cefe39c313. Report an issue: GitHub.

Appendix: source

Thrown at server/apiserver/argoserver.go:599

		return nil
	}

	// Get missing images
	images := make([]string, 0, len(cfg.ArtifactDrivers))
	for _, driver := range cfg.ArtifactDrivers {
		images = append(images, driver.Image)
	}

	for _, container := range pod.Spec.Containers {
		images = slices.DeleteFunc(images, func(image string) bool {
			return image == container.Image
		})
	}

	if len(images) > 0 {
		errorMsg := fmt.Sprintf("Artifact driver validation failed: The following artifact driver images are not present in the server pod: %v. Please ensure all artifact driver images are included in the argo-server pod.", images)
		log.Error(ctx, errorMsg)
		return errors.New(errorMsg)
	}

	log.WithField("driverCount", len(cfg.ArtifactDrivers)).Info(ctx, "Artifact driver validation passed: All configured artifact driver images are present in the server pod")
	return nil
}

type registerFunc func(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) error

// mustRegisterGWHandler is a convenience function to register a gateway handler
func mustRegisterGWHandler(ctx context.Context, register registerFunc, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) {
	err := register(ctx, mux, endpoint, opts)
	if err != nil {
		panic(err)
	}
}

// checkServeErr checks the error from a .Serve() call to decide if it was a graceful shutdown
func (as *argoServer) checkServeErr(ctx context.Context, name string, err error) {

View on GitHub (pinned to 35bff19146)