docker / docker/cli

Inconsistent behavior between `label` and `label!` filters in `volume prune`

Open
#6,918 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

kind/bug status/0-triage
Dominant language
Go
Stars
6.1k
Forks
2.2k
Avg merge
1d 15h
Merged PRs (30d)
43

Description

Description

In docker volume prune, label filters are combined with AND, while label! filters are combined with OR. This seems unexpected, and is not mentioned in the documentation, so I assume it to be a bug.

Reproduce
docker volume create --label a=b --label b=c vol1 && docker volume create --label a=b --label b=c --label d=e vol2 && docker volume create --label b=c --label c=d vol3

docker volume  prune --all --filter label=a=b --filter label=y=y
*no deleted volumes*

docker volume  prune --all --filter label!=a=b --filter label!=y=y
Deleted Volumes:
vol1
vol2
vol3
Expected behavior

I would expect the same logical operation to be used in both cases. By reading only remove volumes with (or without, in case label!=... is used) the specified labels, AND makes more sense, so I would not expect vol1 and vol2 being deleted in the label! example, as they do have the a=b label.

docker version
Client:
 Version:           29.3.1
 API version:       1.54
 Go version:        go1.25.8 X:nodwarf5
 Git commit:        1.fc43
 Built:             Wed Mar 25 00:00:00 2026
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          29.3.1
  API version:      1.54 (minimum version 1.40)
  Go version:       go1.25.8 X:nodwarf5
  Git commit:       1.fc43
  Built:            Wed Mar 25 00:00:00 2026
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          2.1.6
  GitCommit:        1.fc43
 runc:
  Version:          1.4.1
  GitCommit:        
 tini-static:
  Version:          0.19.0
  GitCommit:
docker info
Client:
 Version:    29.3.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  0.31.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 29.3.1
 Storage Driver: overlayfs
  driver-type: io.containerd.snapshotter.v1
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: /usr/bin/tini-static
 containerd version: 1.fc43
 runc version: 
 init version: 
 Security Options:
  seccomp
   Profile: builtin
  selinux
  cgroupns
 Kernel Version: 6.19.10-200.fc43.x86_64
 Operating System: Fedora Linux 43 (Workstation Edition)
 OSType: linux
 Architecture: x86_64
 CPUs: 14
 Total Memory: 30.76GiB
 Name: sbrauner-thinkpadt14gen6.tpb.csb
 ID: bfa28d86-9769-4985-99a5-75ec2afd61fd
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  ::1/128
  127.0.0.0/8
 Live Restore Enabled: false
 Firewall Backend: iptables+firewalld
Additional Info

No response

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the Docker CLI entry point for docker volume prune and trace how repeated label and label!= filters are evaluated. Reproduce the commands in the issue, then inspect the related filter tests if present and add regression coverage showing the intended consistent behavior for both forms.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, go
Domain
cli
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.