From ed2f5d1d85bfd976652b9879be20fcf8a33fbe76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Wed, 23 Aug 2023 13:53:46 +0200 Subject: [PATCH] c8d/builder: Don't drop fields from created image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous image created a new partially filled image. This caused child images to lose their parent's layers. Instead of creating a new object and trying to replace its fields, just clone the original passed image and change its ID to the manifest digest. Signed-off-by: Paweł Gronowski (cherry picked from commit 01214bafd211d1f8c74c1147c39338b27372ede5) Signed-off-by: Paweł Gronowski --- daemon/containerd/image_builder.go | 5 +---- image/image.go | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/daemon/containerd/image_builder.go b/daemon/containerd/image_builder.go index 05338da2dada5..fb864acd05855 100644 --- a/daemon/containerd/image_builder.go +++ b/daemon/containerd/image_builder.go @@ -505,9 +505,6 @@ func (i *ImageService) CreateImage(ctx context.Context, config []byte, parent st return nil, err } - newImage := dimage.NewImage(dimage.ID(createdImage.Target.Digest)) - newImage.V1Image = imgToCreate.V1Image - newImage.V1Image.ID = string(createdImage.Target.Digest) - newImage.History = imgToCreate.History + newImage := dimage.Clone(imgToCreate, dimage.ID(createdImage.Target.Digest)) return newImage, nil } diff --git a/image/image.go b/image/image.go index 856a845b17f98..d17601323ad0f 100644 --- a/image/image.go +++ b/image/image.go @@ -248,6 +248,15 @@ func NewChildImage(img *Image, child ChildConfig, os string) *Image { } } +// Clone clones an image and changes ID. +func Clone(base *Image, id ID) *Image { + img := *base + img.RootFS = img.RootFS.Clone() + img.V1Image.ID = id.String() + img.computedID = id + return &img +} + // History stores build commands that were used to create an image type History struct { // Created is the timestamp at which the image was created