GoogleContainerTools/skaffold · error

kpt deployer mixed in with other deployers not supported yet

Error message

kpt deployer mixed in with other deployers not supported yet. Please use only kpt deployer

What it means

GetDeployer builds the deployer set from the skaffold.yaml `deploy:` configs. The kpt deployer cannot be combined with any other deployer, so if a kpt deployer was just created and any other deployer is already present in the list, this error is returned.

Source

Thrown at pkg/skaffold/runner/deployer.go:200

			deployer, err := kubectl.NewDeployer(dCtx, labeller, d.KubectlDeploy, runCtx.Artifacts(), configName, gks)
			if err != nil {
				return nil, err
			}

			deployers = append(deployers, deployer)
		}

		if d.KptDeploy != nil {
			if d.KptDeploy.Dir == "" {
				log.Entry(context.TODO()).Infof("manifests are deployed from render path %v\n", hydrationDir)
				d.KptDeploy.Dir = hydrationDir
			}
			deployer, err := kptV2.NewDeployer(dCtx, labeller, d.KptDeploy, runCtx.Opts, configName, gks)
			if err != nil {
				return nil, err
			}
			if len(deployers) > 0 {
				return nil, fmt.Errorf("kpt deployer mixed in with other deployers not supported yet. Please use only kpt deployer")
			}
			deployers = append(deployers, deployer)
		}
		if d.CloudRunDeploy != nil {
			deployer, err := getCloudRunDeployer(dCtx.RunContext, labeller, runCtx.DeployConfigs(), configName)
			if err != nil {
				return nil, err
			}
			deployers = append(deployers, deployer)
		}
	}

	if localDeploy && remoteDeploy {
		return nil, errors.New("docker deployment not supported alongside cluster deployments")
	}

	return deploy.NewDeployerMux(deployers, runCtx.IterativeStatusCheck()), nil
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Keep only the `kpt` deployer in the `deploy:` section when using kpt
  2. Move the kubectl/helm deployments into a separate profile or separate skaffold run
  3. If kpt is only needed for some manifests, restructure configs so kpt is used exclusively per invocation

Example fix

// before (skaffold.yaml)
deploy:
  kubectl: {}
  kpt: {}
// after
deploy:
  kpt: {}
Defensive patterns

Strategy: validation

Validate before calling

const deployers = ['kubectl','helm','kustomize','kpt'].filter(k => cfg.deploy?.[k])
if (deployers.includes('kpt') && deployers.length > 1) {
  throw new Error('kpt deployer cannot be combined with: ' + deployers.filter(d => d !== 'kpt').join(','))
}

Prevention

When it happens

Trigger: A skaffold.yaml (or multi-config run) whose `deploy:` section defines `kptDeploy` alongside another deployer such as `kubectlDeploy`, `helmDeploy`, or `kustomizeDeploy`.

Common situations: Merging deploy configs from multiple profiles or `requires:` dependencies where one config uses kpt and another uses kubectl/helm.

Related errors


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