hashicorp/nomad · error

Invalid lifecycle hooks given

Error message

Invalid lifecycle hooks given

What it means

Sentinel validation guard in TaskTemplateManagerConfig.Validate: the caller constructed the manager config without a Lifecycle (hooks) value, so the template manager would have nothing to invoke on template events. It fires only when NewTaskTemplateManager is handed a struct that skipped setting Lifecycle.

Source

Thrown at client/allocrunner/taskrunner/template/template.go:156

	// in downstream platform-specific template runner consumers
	TaskID string

	Logger hclog.Logger

	// RenderFunc allows custom rendering of templated data, and overrides the
	// Nomad custom RenderFunc used for sandboxing. This is currently used by
	// the secrets block to hold all templated data in memory.
	RenderFunc renderer.Renderer
}

// Validate validates the configuration.
func (c *TaskTemplateManagerConfig) Validate() error {
	if c == nil {
		return fmt.Errorf("Nil config passed")
	} else if c.UnblockCh == nil {
		return fmt.Errorf("Invalid unblock channel given")
	} else if c.Lifecycle == nil {
		return fmt.Errorf("Invalid lifecycle hooks given")
	} else if c.Events == nil {
		return fmt.Errorf("Invalid event hook given")
	} else if c.ClientConfig == nil {
		return fmt.Errorf("Invalid client config given")
	} else if c.TaskDir == "" {
		return fmt.Errorf("Invalid task directory given: %q", c.TaskDir)
	} else if c.EnvBuilder == nil {
		return fmt.Errorf("Invalid task environment given")
	} else if c.MaxTemplateEventRate == 0 {
		return fmt.Errorf("Invalid max template event rate given")
	}

	// Once is a runner config, but in Nomad it is set per template, so all
	// templates given to a runner should have the same value for Once.
	var once bool
	for i, t := range c.Templates {
		if i == 0 {
			once = t.Once

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Set the Lifecycle field on TaskTemplateManagerConfig before calling NewTaskTemplateManager
  2. Ensure the taskrunner constructs its lifecycle hooks and passes them into the config struct
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at client/allocrunner/taskrunner/template/template.go:156 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/7af1a2b50ad19a7d. Report an issue: GitHub.