diff options
author | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-04-28 09:30:04 +0200 |
---|---|---|
committer | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-04-28 09:30:04 +0200 |
commit | 1845a915b01c1b7353014166ae6fb9e91d3614aa (patch) | |
tree | 19022790f5962361ee8f137097c34cf165597e8d /daemon | |
parent | 4597f50deb72b96b38f32d7e24cc92b82cc720a5 (diff) | |
download | docker-1845a915b01c1b7353014166ae6fb9e91d3614aa.tar.gz |
c8d/import: Don't gc unnamed images
Create dangling images for imported images which don't have a name
annotation attached. Previously the content got loaded, but no image
referencing it was created which caused it to be garbage collected
immediately.
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/containerd/image_exporter.go | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/daemon/containerd/image_exporter.go b/daemon/containerd/image_exporter.go index c916a60a95..efb9e4e5c4 100644 --- a/daemon/containerd/image_exporter.go +++ b/daemon/containerd/image_exporter.go @@ -103,10 +103,23 @@ func (i *ImageService) ExportImage(ctx context.Context, names []string, outStrea // complement of ExportImage. The input stream is an uncompressed tar // ball containing images and metadata. func (i *ImageService) LoadImage(ctx context.Context, inTar io.ReadCloser, outStream io.Writer, quiet bool) error { - // TODO(vvoland): Allow user to pass platform - platform := cplatforms.All - imgs, err := i.client.Import(ctx, inTar, containerd.WithImportPlatform(platform)) + opts := []containerd.ImportOpt{ + // TODO(vvoland): Allow user to pass platform + containerd.WithImportPlatform(cplatforms.All), + + // Create an additional image with dangling name for imported images... + containerd.WithDigestRef(danglingImageName), + /// ... but only if they don't have a name or it's invalid. + containerd.WithSkipDigestRef(func(nameFromArchive string) bool { + if nameFromArchive == "" { + return false + } + _, err := reference.ParseNormalizedNamed(nameFromArchive) + return err == nil + }), + } + imgs, err := i.client.Import(ctx, inTar, opts...) if err != nil { logrus.WithError(err).Debug("failed to import image to containerd") return errdefs.System(err) @@ -123,8 +136,13 @@ func (i *ImageService) LoadImage(ctx context.Context, inTar io.ReadCloser, outSt } name := img.Name - if named, err := reference.ParseNormalizedNamed(img.Name); err == nil { - name = reference.FamiliarName(named) + loadedMsg := "Loaded image" + + if isDanglingImage(img) { + name = img.Target.Digest.String() + loadedMsg = "Loaded image ID" + } else if named, err := reference.ParseNormalizedNamed(img.Name); err == nil { + name = reference.FamiliarName(reference.TagNameOnly(named)) } for _, platform := range allPlatforms { @@ -150,7 +168,7 @@ func (i *ImageService) LoadImage(ctx context.Context, inTar io.ReadCloser, outSt logger.WithField("alreadyUnpacked", unpacked).WithError(err).Debug("unpack") } - fmt.Fprintf(progress, "Loaded image: %s\n", name) + fmt.Fprintf(progress, "%s: %s\n", loadedMsg, name) i.LogImageEvent(img.Target.Digest.String(), img.Target.Digest.String(), "load") } |