From 6881ae72c721d91883b7d08e063b03446c19f047 Mon Sep 17 00:00:00 2001 From: Austin Vazquez Date: Wed, 5 Nov 2025 14:39:20 -0600 Subject: [PATCH] api/types: use regular slices for disk usage types Signed-off-by: Austin Vazquez --- api/docs/v1.52.yaml | 4 -- api/swagger.yaml | 4 -- api/types/build/disk_usage.go | 2 +- api/types/container/disk_usage.go | 2 +- api/types/image/disk_usage.go | 2 +- api/types/volume/disk_usage.go | 2 +- client/system_disk_usage.go | 72 +++++++++---------- client/system_disk_usage_test.go | 2 +- daemon/server/router/system/system_routes.go | 33 +++++++-- integration/system/disk_usage_test.go | 63 ++++++---------- .../moby/moby/api/types/build/disk_usage.go | 2 +- .../moby/api/types/container/disk_usage.go | 2 +- .../moby/moby/api/types/image/disk_usage.go | 2 +- .../moby/moby/api/types/volume/disk_usage.go | 2 +- .../moby/moby/client/system_disk_usage.go | 72 +++++++++---------- 15 files changed, 131 insertions(+), 135 deletions(-) diff --git a/api/docs/v1.52.yaml b/api/docs/v1.52.yaml index 36668afb2a..52e286a071 100644 --- a/api/docs/v1.52.yaml +++ b/api/docs/v1.52.yaml @@ -2096,7 +2096,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Summary @@ -2279,7 +2278,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Volume @@ -2893,7 +2891,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: CacheRecord @@ -5617,7 +5614,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Summary diff --git a/api/swagger.yaml b/api/swagger.yaml index 36668afb2a..52e286a071 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -2096,7 +2096,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Summary @@ -2279,7 +2278,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Volume @@ -2893,7 +2891,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: CacheRecord @@ -5617,7 +5614,6 @@ definitions: type: "array" x-omitempty: true items: - x-nullable: true x-go-type: type: Summary diff --git a/api/types/build/disk_usage.go b/api/types/build/disk_usage.go index 872d389f75..a55e8545be 100644 --- a/api/types/build/disk_usage.go +++ b/api/types/build/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of build cache records. // - Items []*CacheRecord `json:"Items,omitempty"` + Items []CacheRecord `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive build cache records. // diff --git a/api/types/container/disk_usage.go b/api/types/container/disk_usage.go index d708e22d84..dc0274b78e 100644 --- a/api/types/container/disk_usage.go +++ b/api/types/container/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of container summaries. // - Items []*Summary `json:"Items,omitempty"` + Items []Summary `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive containers. // diff --git a/api/types/image/disk_usage.go b/api/types/image/disk_usage.go index 0b694e3d66..568ea71cfa 100644 --- a/api/types/image/disk_usage.go +++ b/api/types/image/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of image summaries. // - Items []*Summary `json:"Items,omitempty"` + Items []Summary `json:"Items,omitempty"` // Disk space that can be reclaimed by removing unused images. // diff --git a/api/types/volume/disk_usage.go b/api/types/volume/disk_usage.go index 4d1221c2dc..a0df0dc0fd 100644 --- a/api/types/volume/disk_usage.go +++ b/api/types/volume/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of volumes. // - Items []*Volume `json:"Items,omitempty"` + Items []Volume `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive volumes. // diff --git a/client/system_disk_usage.go b/client/system_disk_usage.go index d8cef475b3..a179d86f62 100644 --- a/client/system_disk_usage.go +++ b/client/system_disk_usage.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/url" + "slices" "github.com/moby/moby/api/types/build" "github.com/moby/moby/api/types/container" @@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err) } - var ( - r DiskUsageResult - imagesFrom = []*image.Summary{} - containersFrom = []*container.Summary{} - volumesFrom = []*volume.Volume{} - buildCacheFrom = []*build.CacheRecord{} - ) - + var r DiskUsageResult if du.ImageUsage != nil { r.Images = ImagesDiskUsage{ ActiveImages: du.ImageUsage.ActiveImages, @@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - imagesFrom = du.ImageUsage.Items + r.Images.Items = slices.Clone(du.ImageUsage.Items) } } else { // Fallback for legacy response. @@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis TotalSize: du.LayersSize, } - if du.Images != nil && options.Verbose { - imagesFrom = du.Images + if options.Verbose { + r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) { + for _, i := range du.Images { + if !yield(*i) { + return + } + } + }) } } - r.Images.Items = make([]image.Summary, len(imagesFrom)) - for i, ii := range imagesFrom { - r.Images.Items[i] = *ii - } - if du.ContainerUsage != nil { r.Containers = ContainersDiskUsage{ ActiveContainers: du.ContainerUsage.ActiveContainers, @@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - containersFrom = du.ContainerUsage.Items + r.Containers.Items = slices.Clone(du.ContainerUsage.Items) } } else if du.Containers != nil && options.Verbose { // Fallback for legacy response. - containersFrom = du.Containers - } - - r.Containers.Items = make([]container.Summary, len(containersFrom)) - for i, c := range containersFrom { - r.Containers.Items[i] = *c + r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) { + for _, c := range du.Containers { + if !yield(*c) { + return + } + } + }) } if du.BuildCacheUsage != nil { @@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - buildCacheFrom = du.BuildCacheUsage.Items + r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items) } } else if du.BuildCache != nil && options.Verbose { // Fallback for legacy response. - buildCacheFrom = du.BuildCache - } - - r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom)) - for i, b := range buildCacheFrom { - r.BuildCache.Items[i] = *b + r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) { + for _, b := range du.BuildCache { + if !yield(*b) { + return + } + } + }) } if du.VolumeUsage != nil { @@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - volumesFrom = du.VolumeUsage.Items + r.Volumes.Items = slices.Clone(du.VolumeUsage.Items) } } else if du.Volumes != nil && options.Verbose { // Fallback for legacy response. - volumesFrom = du.Volumes - } - - r.Volumes.Items = make([]volume.Volume, len(volumesFrom)) - for i, v := range volumesFrom { - r.Volumes.Items[i] = *v + r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) { + for _, v := range du.Volumes { + if !yield(*v) { + return + } + } + }) } return r, nil diff --git a/client/system_disk_usage_test.go b/client/system_disk_usage_test.go index f838e353b9..e9917753be 100644 --- a/client/system_disk_usage_test.go +++ b/client/system_disk_usage_test.go @@ -33,7 +33,7 @@ func TestDiskUsage(t *testing.T) { TotalImages: 0, Reclaimable: 0, TotalSize: 4096, - Items: []*image.Summary{}, + Items: []image.Summary{}, }, })(req) })) diff --git a/daemon/server/router/system/system_routes.go b/daemon/server/router/system/system_routes.go index 380aa5d633..9a8e10a032 100644 --- a/daemon/server/router/system/system_routes.go +++ b/daemon/server/router/system/system_routes.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "slices" "strconv" "time" @@ -230,7 +231,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, v.LayersSize = systemDiskUsage.Images.TotalSize //nolint: staticcheck,SA1019: v.LayersSize is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.TotalSize] instead. v.Images = systemDiskUsage.Images.Items //nolint: staticcheck,SA1019: v.Images is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.Items] instead. } else if verbose { - v.ImageUsage.Items = systemDiskUsage.Images.Items + v.ImageUsage.Items = slices.Collect(func(yield func(image.Summary) bool) { + for _, i := range systemDiskUsage.Images.Items { + if !yield(*i) { + return + } + } + }) } } if systemDiskUsage != nil && systemDiskUsage.Containers != nil { @@ -244,7 +251,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, if legacyFields { v.Containers = systemDiskUsage.Containers.Items //nolint: staticcheck,SA1019: v.Containers is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ContainersDiskUsage.Items] instead. } else if verbose { - v.ContainerUsage.Items = systemDiskUsage.Containers.Items + v.ContainerUsage.Items = slices.Collect(func(yield func(container.Summary) bool) { + for _, c := range systemDiskUsage.Containers.Items { + if !yield(*c) { + return + } + } + }) } } if systemDiskUsage != nil && systemDiskUsage.Volumes != nil { @@ -258,7 +271,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, if legacyFields { v.Volumes = systemDiskUsage.Volumes.Items //nolint: staticcheck,SA1019: v.Volumes is deprecated: kept to maintain backwards compatibility with API < v1.52, use [VolumesDiskUsage.Items] instead. } else if verbose { - v.VolumeUsage.Items = systemDiskUsage.Volumes.Items + v.VolumeUsage.Items = slices.Collect(func(yield func(volume.Volume) bool) { + for _, v := range systemDiskUsage.Volumes.Items { + if !yield(*v) { + return + } + } + }) } } if getBuildCache { @@ -289,7 +308,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, if legacyFields { v.BuildCache = buildCache //nolint: staticcheck,SA1019: v.BuildCache is deprecated: kept to maintain backwards compatibility with API < v1.52, use [BuildCacheDiskUsage.Items] instead. } else if verbose { - v.BuildCacheUsage.Items = buildCache + v.BuildCacheUsage.Items = slices.Collect(func(yield func(buildtypes.CacheRecord) bool) { + for _, b := range buildCache { + if !yield(*b) { + return + } + } + }) } } return httputils.WriteJSON(w, http.StatusOK, v) diff --git a/integration/system/disk_usage_test.go b/integration/system/disk_usage_test.go index 0023ef7e98..8b7a9e297f 100644 --- a/integration/system/disk_usage_test.go +++ b/integration/system/disk_usage_test.go @@ -5,10 +5,6 @@ import ( "testing" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/moby/moby/api/types/build" - containertypes "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/image" - "github.com/moby/moby/api/types/volume" "github.com/moby/moby/client" "github.com/moby/moby/v2/integration/internal/container" "github.com/moby/moby/v2/internal/testutil" @@ -56,19 +52,12 @@ func TestDiskUsage(t *testing.T) { } assert.DeepEqual(t, du, client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{ - Items: []containertypes.Summary{}, - }, + Containers: client.ContainersDiskUsage{}, Images: client.ImagesDiskUsage{ TotalSize: expectedLayersSize, - Items: []image.Summary{}, - }, - BuildCache: client.BuildCacheDiskUsage{ - Items: []build.CacheRecord{}, - }, - Volumes: client.VolumesDiskUsage{ - Items: []volume.Volume{}, }, + BuildCache: client.BuildCacheDiskUsage{}, + Volumes: client.VolumesDiskUsage{}, }) return du }, @@ -155,9 +144,9 @@ func TestDiskUsage(t *testing.T) { }, expected: client.DiskUsageResult{ Containers: stepDU.Containers, - Images: client.ImagesDiskUsage{Items: []image.Summary{}}, - BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}}, - Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}}, + Images: client.ImagesDiskUsage{}, + BuildCache: client.BuildCacheDiskUsage{}, + Volumes: client.VolumesDiskUsage{}, }, }, { @@ -167,10 +156,10 @@ func TestDiskUsage(t *testing.T) { Verbose: true, }, expected: client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}}, + Containers: client.ContainersDiskUsage{}, Images: stepDU.Images, - BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}}, - Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}}, + BuildCache: client.BuildCacheDiskUsage{}, + Volumes: client.VolumesDiskUsage{}, }, }, { @@ -180,9 +169,9 @@ func TestDiskUsage(t *testing.T) { Verbose: true, }, expected: client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}}, - Images: client.ImagesDiskUsage{Items: []image.Summary{}}, - BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}}, + Containers: client.ContainersDiskUsage{}, + Images: client.ImagesDiskUsage{}, + BuildCache: client.BuildCacheDiskUsage{}, Volumes: stepDU.Volumes, }, }, @@ -193,10 +182,10 @@ func TestDiskUsage(t *testing.T) { Verbose: true, }, expected: client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}}, - Images: client.ImagesDiskUsage{Items: []image.Summary{}}, + Containers: client.ContainersDiskUsage{}, + Images: client.ImagesDiskUsage{}, BuildCache: stepDU.BuildCache, - Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}}, + Volumes: client.VolumesDiskUsage{}, }, }, { @@ -208,8 +197,8 @@ func TestDiskUsage(t *testing.T) { }, expected: client.DiskUsageResult{ Containers: stepDU.Containers, - Images: client.ImagesDiskUsage{Items: []image.Summary{}}, - BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}}, + Images: client.ImagesDiskUsage{}, + BuildCache: client.BuildCacheDiskUsage{}, Volumes: stepDU.Volumes, }, }, @@ -221,10 +210,10 @@ func TestDiskUsage(t *testing.T) { Verbose: true, }, expected: client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}}, + Containers: client.ContainersDiskUsage{}, Images: stepDU.Images, BuildCache: stepDU.BuildCache, - Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}}, + Volumes: client.VolumesDiskUsage{}, }, }, { @@ -237,9 +226,7 @@ func TestDiskUsage(t *testing.T) { }, expected: client.DiskUsageResult{ Containers: stepDU.Containers, - Images: client.ImagesDiskUsage{ - Items: []image.Summary{}, - }, + Images: client.ImagesDiskUsage{}, BuildCache: stepDU.BuildCache, Volumes: stepDU.Volumes, }, @@ -253,9 +240,7 @@ func TestDiskUsage(t *testing.T) { Verbose: true, }, expected: client.DiskUsageResult{ - Containers: client.ContainersDiskUsage{ - Items: []containertypes.Summary{}, - }, + Containers: client.ContainersDiskUsage{}, Images: stepDU.Images, BuildCache: stepDU.BuildCache, Volumes: stepDU.Volumes, @@ -272,10 +257,8 @@ func TestDiskUsage(t *testing.T) { expected: client.DiskUsageResult{ Containers: stepDU.Containers, Images: stepDU.Images, - BuildCache: client.BuildCacheDiskUsage{ - Items: []build.CacheRecord{}, - }, - Volumes: stepDU.Volumes, + BuildCache: client.BuildCacheDiskUsage{}, + Volumes: stepDU.Volumes, }, }, { diff --git a/vendor/github.com/moby/moby/api/types/build/disk_usage.go b/vendor/github.com/moby/moby/api/types/build/disk_usage.go index 872d389f75..a55e8545be 100644 --- a/vendor/github.com/moby/moby/api/types/build/disk_usage.go +++ b/vendor/github.com/moby/moby/api/types/build/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of build cache records. // - Items []*CacheRecord `json:"Items,omitempty"` + Items []CacheRecord `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive build cache records. // diff --git a/vendor/github.com/moby/moby/api/types/container/disk_usage.go b/vendor/github.com/moby/moby/api/types/container/disk_usage.go index d708e22d84..dc0274b78e 100644 --- a/vendor/github.com/moby/moby/api/types/container/disk_usage.go +++ b/vendor/github.com/moby/moby/api/types/container/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of container summaries. // - Items []*Summary `json:"Items,omitempty"` + Items []Summary `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive containers. // diff --git a/vendor/github.com/moby/moby/api/types/image/disk_usage.go b/vendor/github.com/moby/moby/api/types/image/disk_usage.go index 0b694e3d66..568ea71cfa 100644 --- a/vendor/github.com/moby/moby/api/types/image/disk_usage.go +++ b/vendor/github.com/moby/moby/api/types/image/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of image summaries. // - Items []*Summary `json:"Items,omitempty"` + Items []Summary `json:"Items,omitempty"` // Disk space that can be reclaimed by removing unused images. // diff --git a/vendor/github.com/moby/moby/api/types/volume/disk_usage.go b/vendor/github.com/moby/moby/api/types/volume/disk_usage.go index 4d1221c2dc..a0df0dc0fd 100644 --- a/vendor/github.com/moby/moby/api/types/volume/disk_usage.go +++ b/vendor/github.com/moby/moby/api/types/volume/disk_usage.go @@ -17,7 +17,7 @@ type DiskUsage struct { // List of volumes. // - Items []*Volume `json:"Items,omitempty"` + Items []Volume `json:"Items,omitempty"` // Disk space that can be reclaimed by removing inactive volumes. // diff --git a/vendor/github.com/moby/moby/client/system_disk_usage.go b/vendor/github.com/moby/moby/client/system_disk_usage.go index d8cef475b3..a179d86f62 100644 --- a/vendor/github.com/moby/moby/client/system_disk_usage.go +++ b/vendor/github.com/moby/moby/client/system_disk_usage.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/url" + "slices" "github.com/moby/moby/api/types/build" "github.com/moby/moby/api/types/container" @@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err) } - var ( - r DiskUsageResult - imagesFrom = []*image.Summary{} - containersFrom = []*container.Summary{} - volumesFrom = []*volume.Volume{} - buildCacheFrom = []*build.CacheRecord{} - ) - + var r DiskUsageResult if du.ImageUsage != nil { r.Images = ImagesDiskUsage{ ActiveImages: du.ImageUsage.ActiveImages, @@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - imagesFrom = du.ImageUsage.Items + r.Images.Items = slices.Clone(du.ImageUsage.Items) } } else { // Fallback for legacy response. @@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis TotalSize: du.LayersSize, } - if du.Images != nil && options.Verbose { - imagesFrom = du.Images + if options.Verbose { + r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) { + for _, i := range du.Images { + if !yield(*i) { + return + } + } + }) } } - r.Images.Items = make([]image.Summary, len(imagesFrom)) - for i, ii := range imagesFrom { - r.Images.Items[i] = *ii - } - if du.ContainerUsage != nil { r.Containers = ContainersDiskUsage{ ActiveContainers: du.ContainerUsage.ActiveContainers, @@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - containersFrom = du.ContainerUsage.Items + r.Containers.Items = slices.Clone(du.ContainerUsage.Items) } } else if du.Containers != nil && options.Verbose { // Fallback for legacy response. - containersFrom = du.Containers - } - - r.Containers.Items = make([]container.Summary, len(containersFrom)) - for i, c := range containersFrom { - r.Containers.Items[i] = *c + r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) { + for _, c := range du.Containers { + if !yield(*c) { + return + } + } + }) } if du.BuildCacheUsage != nil { @@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - buildCacheFrom = du.BuildCacheUsage.Items + r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items) } } else if du.BuildCache != nil && options.Verbose { // Fallback for legacy response. - buildCacheFrom = du.BuildCache - } - - r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom)) - for i, b := range buildCacheFrom { - r.BuildCache.Items[i] = *b + r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) { + for _, b := range du.BuildCache { + if !yield(*b) { + return + } + } + }) } if du.VolumeUsage != nil { @@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis } if options.Verbose { - volumesFrom = du.VolumeUsage.Items + r.Volumes.Items = slices.Clone(du.VolumeUsage.Items) } } else if du.Volumes != nil && options.Verbose { // Fallback for legacy response. - volumesFrom = du.Volumes - } - - r.Volumes.Items = make([]volume.Volume, len(volumesFrom)) - for i, v := range volumesFrom { - r.Volumes.Items[i] = *v + r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) { + for _, v := range du.Volumes { + if !yield(*v) { + return + } + } + }) } return r, nil