docker/cli · error
invalid target port ( ): value must be an integer
Error message
invalid target port (%s): value must be an integer: %w
What it means
Thrown by PortOpt.Set (port.go:80) when the `target` (container) port value cannot be parsed as an unsigned 16-bit integer (0–65535). strconv.ParseUint(val, 10, 16) fails on non-numeric, out-of-range, or empty values; the underlying NumError is unwrapped via errors.As and wrapped into this message.
Solutions
- Provide an integer between 0 and 65535 for target: `--publish target=80`.
- Ensure the value is a plain decimal integer with no units or sign for negative.
- Pre-validate with `strconv.ParseUint(val, 10, 16)`.
- Remember target= is the in-container port; published= is the host port.
Example fix
// before --publish published=8080,target=80http // after --publish published=8080,target=80
Defensive patterns
Strategy: validation
Validate before calling
// Validate the target port as a uint16 before Set.
if _, err := strconv.ParseUint(targetVal, 10, 16); err != nil {
return fmt.Errorf("target port %q must be an integer 0-65535", targetVal)
} Prevention
- Target port must be 0–65535, plain decimal.
- Remember target = container port, published = host port.
- Strip units/signs/whitespace.
- Pre-validate with strconv.ParseUint(val, 10, 16).
When it happens
Trigger: Passing `--publish target=abc`, `target=70000` (exceeds uint16), `target=-1`, or `target=` (empty). ParseUint returns an error, errors.As extracts the NumError, and line 80 reports it.
Common situations: Typos, values exceeding 65535, negative numbers, empty strings from variable expansion, or confusion between the target (container) and published (host) port slots.
Related errors
- invalid field
- invalid protocol value
- invalid publish mode value
- invalid published port
- invalid field key
AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07).
Data as JSON: /api/errors/84e1d65415cbbfc6.
Report an issue: GitHub.
Appendix: source
Thrown at opts/swarmopts/port.go:80
pConfig.Protocol = proto
default:
return fmt.Errorf("invalid protocol value '%s'", val)
}
case portOptMode:
switch swarm.PortConfigPublishMode(val) {
case swarm.PortConfigPublishModeIngress, swarm.PortConfigPublishModeHost:
pConfig.PublishMode = swarm.PortConfigPublishMode(val)
default:
return fmt.Errorf("invalid publish mode value (%s): must be either '%s' or '%s'", val, swarm.PortConfigPublishModeIngress, swarm.PortConfigPublishModeHost)
}
case portOptTargetPort:
tPort, err := strconv.ParseUint(val, 10, 16)
if err != nil {
var numErr *strconv.NumError
if errors.As(err, &numErr) {
err = numErr.Err
}
return fmt.Errorf("invalid target port (%s): value must be an integer: %w", val, err)
}
pConfig.TargetPort = uint32(tPort)
case portOptPublishedPort:
pPort, err := strconv.ParseUint(val, 10, 16)
if err != nil {
var numErr *strconv.NumError
if errors.As(err, &numErr) {
err = numErr.Err
}
return fmt.Errorf("invalid published port (%s): value must be an integer: %w", val, err)
}
pConfig.PublishedPort = uint32(pPort)
default:
return fmt.Errorf("invalid field key: %s", key)
}
}View on GitHub (pinned to 4f84911bfe)