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
- Correct the offending duration string to Go syntax: number + unit (e.g. "5m").
- Convert ISO-8601 durations (PT5M) to Go durations (5m).
- Test the client config with nomad validate and read the error for the exact parse failure.
- 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
- Adopt Go duration syntax ("30m", "1h") everywhere.
- Convert ISO-8601 durations before use.
- Run nomad validate on all client configs.
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.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- failed to parse 'image_delay' duration: %v
- failed to parse 'period' duration: %v
- failed to parse 'creation_grace' duration: %v
- creation_grace is less than minimum, %v
- failed to parse 'pull_activity_timeout' duration: %v
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/854022ae6e54ede2.
Report an issue: GitHub.