diff --git a/cmd/nerdctl/volume/volume_list_test.go b/cmd/nerdctl/volume/volume_list_test.go index d0ad6d78463..8f5892cb6d9 100644 --- a/cmd/nerdctl/volume/volume_list_test.go +++ b/cmd/nerdctl/volume/volume_list_test.go @@ -270,9 +270,6 @@ func TestVolumeLsFilter(t *testing.T) { }, { Description: "Retrieving name=volume1 and name=volume2", - // FIXME: https://github.com/containerd/nerdctl/issues/3452 - // Nerdctl filter behavior is broken - Require: nerdtest.Docker, Command: func(data test.Data, helpers test.Helpers) test.Command { return helpers.Command("volume", "ls", "--quiet", "--filter", "name="+data.Get("vol1"), "--filter", "name="+data.Get("vol2")) }, diff --git a/pkg/cmd/volume/list.go b/pkg/cmd/volume/list.go index b934f0a9614..bb0654ba5b2 100644 --- a/pkg/cmd/volume/list.go +++ b/pkg/cmd/volume/list.go @@ -269,15 +269,28 @@ func volumeMatchesFilter(vol native.Volume, labelFilterFuncs []func(*map[string] return false } } - for _, nameFilterFunc := range nameFilterFuncs { - if !nameFilterFunc(vol.Name) { - return false - } + + if !anyMatch(vol.Name, nameFilterFuncs) { + return false } + for _, sizeFilterFunc := range sizeFilterFuncs { if !sizeFilterFunc(vol.Size) { return false } } + return true } + +func anyMatch[T any](vol T, filters []func(T) bool) bool { + if len(filters) == 0 { + return true + } + for _, f := range filters { + if f(vol) { + return true + } + } + return false +}