{"record":{"id":"37e8b0e7faae52cd","repo":"docker/cli","slug":"invalid-ip-address-s","errorCode":null,"errorMessage":"invalid IP address: %s","messagePattern":"invalid IP address: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/command/swarm/init.go","lineNumber":84,"sourceCode":"\treturn cmd\n}\n\nfunc runInit(ctx context.Context, dockerCLI command.Cli, flags *pflag.FlagSet, opts initOptions) error {\n\tapiClient := dockerCLI.Client()\n\n\t// TODO(thaJeztah): change opts.defaultAddrPools a []netip.Prefix; see https://github.com/docker/cli/pull/6545#discussion_r2420361609\n\tdefaultAddrPool := make([]netip.Prefix, 0, len(opts.defaultAddrPools))\n\tfor _, p := range opts.defaultAddrPools {\n\t\tif len(p.IP) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tip := p.IP.To4()\n\t\tif ip == nil {\n\t\t\tip = p.IP.To16()\n\t\t}\n\t\taddr, ok := netip.AddrFromSlice(ip)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"invalid IP address: %s\", p.IP)\n\t\t}\n\t\tones, _ := p.Mask.Size()\n\t\tdefaultAddrPool = append(defaultAddrPool, netip.PrefixFrom(addr, ones))\n\t}\n\tvar availability swarm.NodeAvailability\n\tif flags.Changed(flagAvailability) {\n\t\tswitch a := swarm.NodeAvailability(strings.ToLower(opts.availability)); a {\n\t\tcase swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:\n\t\t\tavailability = a\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid availability %q, only active, pause and drain are supported\", opts.availability)\n\t\t}\n\t}\n\n\tres, err := apiClient.SwarmInit(ctx, client.SwarmInitOptions{\n\t\tListenAddr:       opts.listenAddr.String(),\n\t\tAdvertiseAddr:    opts.advertiseAddr,\n\t\tDataPathAddr:     opts.dataPathAddr,","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/command/swarm/init.go#L66-L102","documentation":"Raised while converting --default-addr-pool entries to netip.Prefix during 'docker swarm init'. After normalizing a pool's IP to 4 or 16 bytes, netip.AddrFromSlice rejects the slice (e.g. a zero-length IP), which means the supplied CIDR could not yield a valid address.","triggerScenarios":"Passing --default-addr-pool with a malformed CIDR whose IP portion is empty or otherwise unparseable as IPv4/IPv6 (e.g. an all-zero mask with empty IP, or a degenerate IPNet). The loop at init.go:73-88 fails when netip.AddrFromSlice(ip) returns ok==false.","commonSituations":"Typo in CIDR; passing '/24' without an address; programmatically building net.IPNet values with nil IP; shell quoting stripping the IP portion.","solutions":["Use a well-formed CIDR like '10.0.0.0/8' or '192.168.0.0/16'.","Verify each pool parses with 'ipcalc <cidr>' or 'python3 -c \"import ipaddress; ipaddress.ip_network(''CIDR'')\"'.","Drop --default-addr-pool to accept Docker's default address pools."],"exampleFix":"# before\ndocker swarm init --default-addr-pool /24\n\n# after\ndocker swarm init --default-addr-pool 10.0.0.0/8 --subnet-size 24","handlingStrategy":"validation","validationCode":"// Validate each CIDR before init\nfor _, cidr := range pools {\n    if _, err := netip.ParsePrefix(cidr); err != nil {\n        return fmt.Errorf(\"invalid default-addr-pool %q: %w\", cidr, err)\n    }\n}","typeGuard":"func validCIDR(s string) bool {\n\t_, err := netip.ParsePrefix(s)\n\treturn err == nil\n}","tryCatchPattern":null,"preventionTips":["Pre-validate CIDRs with netip.ParsePrefix in scripts.","Prefer standard private ranges (10.0.0.0/8, 192.168.0.0/16).","Avoid degenerate entries like '/24' with no address."],"tags":["swarm","init","network","cidr","validation"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}