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

  1. Use exactly one of: active, pause, drain (case-insensitive).
  2. If unsure, omit --availability to default to active.
  3. 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

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


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)