hashicorp/nomad · error

failed to parse 'image_delay' duration: %v

Error message

failed to parse 'image_delay' duration: %v

What it means

The Docker driver plugin accepts an image_delay GC option that must parse as a Go time.ParseDuration string (e.g. "30m", "1h"). During SetConfig, an unparsable value for GC.ImageDelay causes the plugin config load to fail with this wrapped error, which includes the underlying parse error.

Source

Thrown at drivers/docker/config.go:782

const danglingContainersCreationGraceMinimum = 1 * time.Minute
const pullActivityTimeoutMinimum = 1 * time.Minute

func (d *Driver) SetConfig(c *base.Config) error {
	var config DriverConfig
	if len(c.PluginConfig) != 0 {
		if err := base.MsgPackDecode(c.PluginConfig, &config); err != nil {
			return err
		}
	}

	d.compute = c.AgentConfig.Compute()
	d.config = &config
	d.config.InfraImage = strings.TrimPrefix(d.config.InfraImage, "https://")

	if len(d.config.GC.ImageDelay) > 0 {
		dur, err := time.ParseDuration(d.config.GC.ImageDelay)
		if err != nil {
			return fmt.Errorf("failed to parse 'image_delay' duration: %v", err)
		}
		d.config.GC.imageDelayDuration = dur
	}

	if len(d.config.GC.DanglingContainers.PeriodStr) > 0 {
		dur, err := time.ParseDuration(d.config.GC.DanglingContainers.PeriodStr)
		if err != nil {
			return fmt.Errorf("failed to parse 'period' duration: %v", err)
		}
		d.config.GC.DanglingContainers.period = dur
	}

	if len(d.config.GC.DanglingContainers.CreationGraceStr) > 0 {
		dur, err := time.ParseDuration(d.config.GC.DanglingContainers.CreationGraceStr)
		if err != nil {
			return fmt.Errorf("failed to parse 'creation_grace' duration: %v", err)
		}
		if dur < danglingContainersCreationGraceMinimum {

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Use a valid duration string with a unit: "30m", "1h", "2h30m".
  2. Fix the plugin config block and restart the Nomad client.
  3. Remember Go duration units: ns, us, ms, s, m, h — no 'd' for days (use e.g. "24h").

Example fix

// before
plugin "docker" {
  config {
    gc {
      image_delay = "1day"
    }
  }
}
// after
plugin "docker" {
  config {
    gc {
      image_delay = "24h"
    }
  }
}
Defensive patterns

Strategy: validation

Validate before calling

if _, err := time.ParseDuration(cfg.GC.ImageDelay); cfg.GC.ImageDelay != "" && err != nil {
  return fmt.Errorf("image_delay invalid: %v", err)
}

Try / catch

dur, err := time.ParseDuration(cfg.GC.ImageDelay)
if err != nil {
  return fmt.Errorf("failed to parse 'image_delay' duration: %v", err)
}

Prevention

When it happens

Trigger: client option block for plugin "docker" sets gc { image_delay = "1hour" } or "30" (missing unit), failing time.ParseDuration.

Common situations: Missing unit suffix ("90" instead of "90s"), wrong unit names ("hours", "1d"), or templating leaving stray characters in the Nomad client config.

Understand the failure class

Background: "invalid duration" / "failed to parse duration": why your timeout, interval, or TTL string is rejected and which formats each library accepts — this error's family across 32 libraries.

Related errors


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