jdx/mise · error
bootstrap compose project '{name}' wait_timeout must be grea
Error message
bootstrap compose project '{name}' wait_timeout must be greater than zero What it means
`wait_timeout` is passed as a duration to the wait logic; a zero timeout would either fail instantly or wait forever depending on interpretation, so `ComposeRequest::from_toml` rejects `wait_timeout = 0` explicitly.
Source
Thrown at src/system/compose.rs:295
config.project_dir.display()
);
}
validate_project_name(config.project_name.as_deref())?;
validate_values("profile", &config.profiles)?;
validate_values("service", &config.services)?;
validate_values("oneshot service", &config.oneshot)?;
validate_command("command", &config.command)?;
validate_command("engine_command", &config.engine_command)?;
if config.state == ComposeState::Absent && !config.services.is_empty() {
bail!(
"bootstrap compose project '{name}' services cannot be combined with state = \"absent\" because compose down removes the entire project"
);
}
if !config.wait && config.wait_timeout.is_some() {
bail!("bootstrap compose project '{name}' wait_timeout requires wait = true");
}
if config.wait_timeout == Some(0) {
bail!("bootstrap compose project '{name}' wait_timeout must be greater than zero");
}
if config.state != ComposeState::Absent
&& (config.down_volumes || config.down_images.is_some())
{
bail!(
"bootstrap compose project '{name}' down_volumes and down_images require state = \"absent\""
);
}
if config.state != ComposeState::Running && config.renew_anonymous_volumes {
bail!(
"bootstrap compose project '{name}' renew_anonymous_volumes requires state = \"running\""
);
}
let explicit_dependencies = config
.depends_on
.iter()
.map(|dependency| parse_dependency(dependency))
.collect::<Result<Vec<_>>>()?;View on GitHub (pinned to 9dcfcaa0dc)
Solutions
- Set a positive timeout appropriate to your healthchecks, e.g. `wait_timeout = 300`.
- If you intended no waiting at all, remove `wait_timeout` (and `wait`).
Example fix
# before [bootstrap.compose.web] project_dir = "/srv/web" wait = true wait_timeout = 0 # after [bootstrap.compose.web] project_dir = "/srv/web" wait = true wait_timeout = 300
Defensive patterns
Strategy: validation
Validate before calling
if let Some(t) = cfg.wait_timeout {
assert!(t > 0, "wait_timeout must be > 0, got {t}");
} Prevention
- There is no '0 = unlimited' semantics; size the timeout to your slowest healthcheck plus margin.
- Use timeouts derived from real `docker compose up --wait` observations, not placeholder 0s.
When it happens
Trigger: A compose table sets `wait_timeout = 0` (with `wait = true` set or not — the zero check runs after the wait-pairing check).
Common situations: Using 0 to mean 'no limit' or 'disabled' — this config does not support that meaning; leftover placeholder values from templating.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- bootstrap compose project '{name}' wait_timeout requires wai
- bootstrap compose project names cannot be empty
- bootstrap compose project '{name}' oneshot services must als
- bootstrap compose project '{name}' project_dir must be absol
- bootstrap compose project '{name}' services cannot be combin
AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17).
Data as JSON: /api/errors/9cf70a4df17c44e2.
Report an issue: GitHub.