From caa5f49029c75a3d2211bb2e7489871330badce5 Mon Sep 17 00:00:00 2001 From: Matthew Endsley Date: Fri, 1 Nov 2024 01:11:46 -0700 Subject: [PATCH] Forward all labels to the snapshotter This is primarily motivated by the desire to create windows containers with a rootfs size larger than the snapshotter default. This can be acheived with the `ctr run` command with the `--snapshotter-label` argument. The snapshotter filters labels for which it has an interest and ignores others, so this change simply forwards all supplied labels instead of making an API change. For the two cases below the commands run are: 1. `docker run --rm -it mcr.microsoft.com/windows/servercore:ltsc2022 powershell -Command "(gdr C).Free + (gdr C).Used"` 2. `docker run --label "containerd.io/snapshot/windows/rootfs.sizebytes=32212254720" --rm -it mcr.microsoft.com/windows/servercore:ltsc2022 powershell -Command "(gdr C).Free + (gdr C).Used"` Before this change: ------------------- Output from 1: `21339549696` Output from 2: `21339549696` After this change: ------------------ Output from 1: `21339549696` Output from 2: `32076963840` --- daemon/containerd/image_snapshot.go | 14 +++++++++----- daemon/create.go | 2 +- daemon/image_service.go | 2 +- daemon/images/service.go | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/daemon/containerd/image_snapshot.go b/daemon/containerd/image_snapshot.go index 24f2fd62b4ecf..0cb2084387408 100644 --- a/daemon/containerd/image_snapshot.go +++ b/daemon/containerd/image_snapshot.go @@ -21,7 +21,7 @@ import ( ) // CreateLayer creates a new layer for a container. -func (i *ImageService) CreateLayer(ctr *container.Container, initFunc layer.MountInit) (container.RWLayer, error) { +func (i *ImageService) CreateLayer(ctr *container.Container, initFunc layer.MountInit, labels map[string]string) (container.RWLayer, error) { var descriptor *ocispec.Descriptor if ctr.ImageManifest != nil { descriptor = ctr.ImageManifest @@ -31,7 +31,7 @@ func (i *ImageService) CreateLayer(ctr *container.Container, initFunc layer.Moun StorageOpt: ctr.HostConfig.StorageOpt, } - return i.createLayer(descriptor, ctr.ID, rwLayerOpts, initFunc) + return i.createLayer(descriptor, ctr.ID, rwLayerOpts, initFunc, labels) } // CreateLayerFromImage creates a new layer from an image @@ -41,10 +41,10 @@ func (i *ImageService) CreateLayerFromImage(img *image.Image, layerName string, descriptor = img.Details.ManifestDescriptor } - return i.createLayer(descriptor, layerName, rwLayerOpts, nil) + return i.createLayer(descriptor, layerName, rwLayerOpts, nil, nil) } -func (i *ImageService) createLayer(descriptor *ocispec.Descriptor, layerName string, rwLayerOpts *layer.CreateRWLayerOpts, initFunc layer.MountInit) (container.RWLayer, error) { +func (i *ImageService) createLayer(descriptor *ocispec.Descriptor, layerName string, rwLayerOpts *layer.CreateRWLayerOpts, initFunc layer.MountInit, labels map[string]string) (container.RWLayer, error) { ctx := context.TODO() var parentSnapshot string if descriptor != nil { @@ -78,7 +78,11 @@ func (i *ImageService) createLayer(descriptor *ocispec.Descriptor, layerName str if !i.idMapping.Empty() { err = i.remapSnapshot(ctx, sn, layerName, parentSnapshot) } else { - _, err = sn.Prepare(ctx, layerName, parentSnapshot) + sopts := []snapshots.Opt { + snapshots.WithLabels(labels), + } + + _, err = sn.Prepare(ctx, layerName, parentSnapshot, sopts...) } if err != nil { diff --git a/daemon/create.go b/daemon/create.go index 5ac5fd453f560..1dd8c4ab84536 100644 --- a/daemon/create.go +++ b/daemon/create.go @@ -228,7 +228,7 @@ func (daemon *Daemon) create(ctx context.Context, daemonCfg *config.Config, opts ctr.ImageManifest = imgManifest // Set RWLayer for container after mount labels have been set - rwLayer, err := daemon.imageService.CreateLayer(ctr, setupInitLayer(daemon.idMapping.RootPair())) + rwLayer, err := daemon.imageService.CreateLayer(ctr, setupInitLayer(daemon.idMapping.RootPair()), opts.params.Config.Labels) if err != nil { return nil, errdefs.System(err) } diff --git a/daemon/image_service.go b/daemon/image_service.go index 8293d5e16f053..35775d84f9824 100644 --- a/daemon/image_service.go +++ b/daemon/image_service.go @@ -47,7 +47,7 @@ type ImageService interface { // Layers GetImageAndReleasableLayer(ctx context.Context, refOrID string, opts backend.GetImageAndLayerOptions) (builder.Image, builder.ROLayer, error) - CreateLayer(container *container.Container, initFunc layer.MountInit) (container.RWLayer, error) + CreateLayer(container *container.Container, initFunc layer.MountInit, labels map[string]string) (container.RWLayer, error) CreateLayerFromImage(img *image.Image, layerName string, rwLayerOpts *layer.CreateRWLayerOpts) (container.RWLayer, error) GetLayerByID(cid string) (container.RWLayer, error) LayerStoreStatus() [][2]string diff --git a/daemon/images/service.go b/daemon/images/service.go index 1c6167197c981..2ea09484dc6e1 100644 --- a/daemon/images/service.go +++ b/daemon/images/service.go @@ -118,7 +118,7 @@ func (i *ImageService) Children(_ context.Context, id image.ID) ([]image.ID, err // CreateLayer creates a filesystem layer for a container. // called from create.go // TODO: accept an opt struct instead of container? -func (i *ImageService) CreateLayer(container *container.Container, initFunc layer.MountInit) (container.RWLayer, error) { +func (i *ImageService) CreateLayer(container *container.Container, initFunc layer.MountInit, labels map[string]string) (container.RWLayer, error) { var img *image.Image if container.ImageID != "" { containerImg, err := i.imageStore.Get(container.ImageID)