docker/cli · error
invalid generic-resource request
Error message
invalid generic-resource request `%s=%s`, Named Generic Resources is not supported for service create or update
What it means
Returned by ParseGenericResources (generic_resource_opts.go:42) when a parsed resource carries a NamedResourceSpec. Services can only request discrete (counted) generic resources, not named/discrete-by-identity resources; the loop at generic_resource_opts.go:40-46 explicitly rejects any entry whose NamedResourceSpec is non-nil.
Solutions
- Request a count instead: `--generic-resource "GPU=1"`.
- Leave named/identity resources to node labels and node advertisement (`docker node update --label-add`).
- Review the generic resources design doc referenced in the source for the named-vs-discrete distinction.
Example fix
// before docker service create --generic-resource "GPU=device-7" --name svc img // after docker service create --generic-resource "GPU=1" --name svc img
Defensive patterns
Strategy: validation
Validate before calling
// Reject named-resource requests for services up front.
func rejectNamedResources(entries []string) error {
res, err := genericresource.Parse(entries)
if err != nil { return err }
for _, r := range res {
if r.NamedResourceSpec != nil {
return fmt.Errorf("named generic resources not supported for services: %s=%s",
r.NamedResourceSpec.Kind, r.NamedResourceSpec.Value)
}
}
return nil
} Type guard
// isDiscreteOnly reports whether all entries request counted (discrete) resources.
func isDiscreteOnly(entries []string) bool {
res, err := genericresource.Parse(entries)
if err != nil { return false }
for _, r := range res {
if r.NamedResourceSpec != nil { return false }
}
return true
} Prevention
- Request counts (GPU=2), not device identities, for services.
- Reserve named resources for node advertisement.
- Document the named-vs-discrete distinction for ops teams.
When it happens
Trigger: Requesting a named generic resource for a service, e.g. `--generic-resource "GPU=device-uuid"` where the value names a specific device rather than a count. Named resources are reserved for node advertisement, not service requests.
Common situations: Copying a node-advertisement format (`GPU=device1`) into a service create/update, or misunderstanding that services consume counts while nodes advertise identities.
Related errors
- invalid generic-resource format
- invalid generic resource specification
- invalid generic-resource `%+v` for service task
- duplicate generic-resource `%+v` for service task
- other flags may not be combined with --rollback
AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07).
Data as JSON: /api/errors/6f1eb6fde0e39237.
Report an issue: GitHub.
Appendix: source
Thrown at cli/command/service/generic_resource_opts.go:42
return val, nil
}
// ParseGenericResources parses an array of Generic resourceResources
// Requesting Named Generic Resources for a service is not supported this
// is filtered here.
func ParseGenericResources(value []string) ([]swarm.GenericResource, error) {
if len(value) == 0 {
return nil, nil
}
swarmResources, err := genericresource.Parse(value)
if err != nil {
return nil, fmt.Errorf("invalid generic resource specification: %w", err)
}
for _, res := range swarmResources {
if res.NamedResourceSpec != nil {
return nil, fmt.Errorf("invalid generic-resource request `%s=%s`, Named Generic Resources is not supported for service create or update",
res.NamedResourceSpec.Kind, res.NamedResourceSpec.Value,
)
}
}
return swarmResources, nil
}
func buildGenericResourceMap(genericRes []swarm.GenericResource) (map[string]swarm.GenericResource, error) {
m := make(map[string]swarm.GenericResource)
for _, res := range genericRes {
if res.DiscreteResourceSpec == nil {
return nil, fmt.Errorf("invalid generic-resource `%+v` for service task", res)
}
_, ok := m[res.DiscreteResourceSpec.Kind]
if ok {View on GitHub (pinned to 4f84911bfe)