hashicorp/nomad · error

failed to parse 'infra_image_pull_timeout' duration: %v

Error message

failed to parse 'infra_image_pull_timeout' duration: %v

What it means

All duration strings in the Docker driver config are validated in SetConfig via time.ParseDuration; any unparseable string produces a wrapped error of the form "failed to parse '<option>' duration: %v" naming the specific field. This is a docker plugin config-loading failure.

Source

Thrown at drivers/docker/config.go:820

		}
		d.config.GC.DanglingContainers.CreationGrace = dur
	}

	if len(d.config.PullActivityTimeout) > 0 {
		dur, err := time.ParseDuration(d.config.PullActivityTimeout)
		if err != nil {
			return fmt.Errorf("failed to parse 'pull_activity_timeout' duration: %v", err)
		}
		if dur < pullActivityTimeoutMinimum {
			return fmt.Errorf("pull_activity_timeout is less than minimum, %v", pullActivityTimeoutMinimum)
		}
		d.config.pullActivityTimeoutDuration = dur
	}

	if d.config.InfraImagePullTimeout != "" {
		dur, err := time.ParseDuration(d.config.InfraImagePullTimeout)
		if err != nil {
			return fmt.Errorf("failed to parse 'infra_image_pull_timeout' duration: %v", err)
		}
		d.config.infraImagePullTimeoutDuration = dur
	}

	if d.config.ImagePullTimeout != "" {
		_, err := time.ParseDuration(d.config.ImagePullTimeout)
		if err != nil {
			return fmt.Errorf("failed to parse 'image_pull_timeout' duration: %v", err)
		}
	}

	if err := validateAllowedNamespace(d.config.AllowedModes); err != nil {
		return err
	}
	d.config.allowRuntimes = make(map[string]struct{}, len(d.config.AllowRuntimesList))
	for _, r := range d.config.AllowRuntimesList {
		d.config.allowRuntimes[r] = struct{}{}
	}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Correct the offending duration string to Go syntax: number + unit (e.g. "5m").
  2. Convert ISO-8601 durations (PT5M) to Go durations (5m).
  3. Test the client config with nomad validate and read the error for the exact parse failure.
  4. Ensure templating/env substitution produces final literal values.

Example fix

// before
image_delay = "PT30M"
// after
image_delay = "30m"
Defensive patterns

Strategy: validation

Validate before calling

for name, s := range map[string]string{
  "image_delay": cfg.ImageDelay,
  "pull_activity_timeout": cfg.PullActivityTimeout,
} {
  if s == "" { continue }
  if _, err := time.ParseDuration(s); err != nil {
    return fmt.Errorf("%s invalid: %v", name, err)
  }
}

Try / catch

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

Prevention

When it happens

Trigger: Any client plugin docker duration field (image_delay, period, creation_grace, pull_activity_timeout, infra_image_pull_timeout) set to a string time.ParseDuration rejects, e.g. ISO-8601 "PT30M" or unitless values.

Common situations: Script-generated client configs missing units; ISO-8601 durations; environment-variable interpolation failures leaving empty or malformed values.

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/854022ae6e54ede2. Report an issue: GitHub.