docker/cli · error
invalid availability
Error message
invalid availability %q, only active, pause and drain are supported
What it means
Returned by 'docker swarm init' when --availability is explicitly set but its value is not one of active, pause, drain (case-insensitive). The switch at init.go:91-96 only accepts swarm.NodeAvailabilityActive/Pause/Drain.
Solutions
- Use exactly one of: active, pause, drain (case-insensitive).
- If unsure, omit --availability to default to active.
- Double-check spelling and strip any trailing spaces/quotes from the value.
Example fix
# before docker swarm init --availability drained # after docker swarm init --availability drain
Defensive patterns
Strategy: validation
Validate before calling
// Validate availability before calling init
validAvail := map[string]bool{"active": true, "pause": true, "drain": true}
if opts.availability != "" && !validAvail[strings.ToLower(opts.availability)] {
return fmt.Errorf("invalid availability %q", opts.availability)
} Type guard
func isValidAvailability(s string) bool {
switch strings.ToLower(s) {
case "active", "pause", "drain":
return true
}
return false
} Prevention
- Use only active, pause, drain (case-insensitive).
- Omit --availability to accept the active default.
- Centralize the allowed set in a shared constant in scripts.
When it happens
Trigger: Running 'docker swarm init --availability <other>' where <other> is e.g. 'drained', 'running', 'enabled', or a typo. Only triggered when flags.Changed(flagAvailability) is true.
Common situations: Misremembered value ('drained' vs 'drain', 'paused' vs 'pause'); copy-pasted a Kubernetes-style value; trailing whitespace.
Related errors
- invalid IP address
- invalid availability
- error reading from STDIN: data is empty
- config file is required
- cannot supply extra formatting options to the pretty…
AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07).
Data as JSON: /api/errors/7f0ab27ffb00cba6.
Report an issue: GitHub.
Appendix: source
Thrown at cli/command/swarm/init.go:95
}
ip := p.IP.To4()
if ip == nil {
ip = p.IP.To16()
}
addr, ok := netip.AddrFromSlice(ip)
if !ok {
return fmt.Errorf("invalid IP address: %s", p.IP)
}
ones, _ := p.Mask.Size()
defaultAddrPool = append(defaultAddrPool, netip.PrefixFrom(addr, ones))
}
var availability swarm.NodeAvailability
if flags.Changed(flagAvailability) {
switch a := swarm.NodeAvailability(strings.ToLower(opts.availability)); a {
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
availability = a
default:
return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
}
}
res, err := apiClient.SwarmInit(ctx, client.SwarmInitOptions{
ListenAddr: opts.listenAddr.String(),
AdvertiseAddr: opts.advertiseAddr,
DataPathAddr: opts.dataPathAddr,
DataPathPort: opts.dataPathPort,
DefaultAddrPool: defaultAddrPool,
ForceNewCluster: opts.forceNewCluster,
Spec: opts.swarmOptions.ToSpec(flags),
AutoLockManagers: opts.swarmOptions.autolock,
Availability: availability,
SubnetSize: opts.DefaultAddrPoolMaskLength,
})
if err != nil {
if strings.Contains(err.Error(), "could not choose an IP address to advertise") || strings.Contains(err.Error(), "could not find the system's IP address") {
return fmt.Errorf("%w - specify one with --advertise-addr", err)View on GitHub (pinned to 4f84911bfe)