GoogleContainerTools/skaffold · error

exiting dev mode because first render failed: %w

Error message

exiting dev mode because first render failed: %w

What it means

Fires in dev-mode's Dev loop when the initial render fails and --keep-running-on-failure is not enabled, so skaffold exits instead of waiting for the user to fix the error. Wraps the render error (manifest generation/rendering problem) and marks the dev loop as failed in the render phase.

Source

Thrown at pkg/skaffold/runner/dev.go:323

	defer r.deployer.GetDebugger().Stop()

	// Logs should be retrieved up to just before the deploy
	r.deployer.GetLogger().SetSince(time.Now())

	// First render
	manifests, err := r.Render(ctx, out, r.Builds, false)
	for ; err != nil && r.runCtx.Opts.KeepRunningOnFailure; manifests, err = r.Render(ctx, out, r.Builds, false) {
		log.Entry(ctx).Warnf("Failed to render :%v, please fix the error and press any key to continue.", err)
		errT := term.WaitForKeyPress()
		if errT != nil {
			return errT
		}
	}
	if err != nil {
		event.DevLoopFailedInPhase(r.devIteration, constants.Render, err)
		eventV2.TaskFailed(constants.DevLoop, err)
		endTrace()
		return fmt.Errorf("exiting dev mode because first render failed: %w", err)
	}

	// First deploy
	err = r.Deploy(ctx, out, r.Builds, manifests)
	for ; err != nil && r.runCtx.Opts.KeepRunningOnFailure; err = r.Deploy(ctx, out, r.Builds, manifests) {
		log.Entry(ctx).Warnf("Failed to deploy :%v, please fix the error and press any key to continue.", err)
		errT := term.WaitForKeyPress()
		if errT != nil {
			return errT
		}
		// The previous Render Stage could succeed even for kubernetes resource with unknown fields, this will lead to failure in Deploy Stage
		// users need to fix the problems in their manifests, and skaffold needs to re-render them before re-running Deploy Stage in this case.
		for manifests, err = r.Render(ctx, out, r.Builds, false); err != nil; manifests, err = r.Render(ctx, out, r.Builds, false) {
			log.Entry(ctx).Warnf("Failed to Render, please fix the error and press any key to continue. %v", err)
			errT := term.WaitForKeyPress()
			if errT != nil {
				return errT
			}

View on GitHub (pinned to a1189de023)

Solutions

  1. Read the wrapped render error to find the failing manifest/helm/kustomize step
  2. Fix the YAML/chart/kustomize overlay error
  3. Validate manifests with `skaffold render` standalone before entering dev
  4. Check helm values files and kustomization.yaml paths

Example fix

// before
bases:
  - ../missing-base
// after
bases:
  - ../base
Defensive patterns

Strategy: validation

Validate before calling

// pre-validate render before dev
if (runCmd('skaffold render --output /tmp/render-check.yaml').code !== 0) exit('render fails; fix manifests first')

Type guard

function renderersValid(cfg) {
  const r = cfg.render || {}
  if (r.helm && !r.helm.releases) return false
  if (r.kustomize && !r.kustomize.paths) return false
  return true
}

Try / catch

err := r.Dev(ctx, out, dryRun)
if err != nil && strings.Contains(err.Error(), "first render failed") {
    log.Fatalf("fix render: %v", err) // manifests must be fixed before dev can run
}

Prevention

When it happens

Trigger: Dev(): after build/test, r.Render fails on the first iteration (KeepRunningOnFailure retries exhausted or disabled), constants.Render phase marked failed and dev exits.

Common situations: Helm chart values errors; kustomize overlay referencing a missing file/base; raw manifests with invalid YAML or missing image placeholder; unresolvable lifecycleHook render commands.

Related errors


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