Merge pull request #197 from Random-Liu/not-remove-out-dated-tag

Do not remove out dated image tag.
This commit is contained in:
Lantao Liu 2017-09-01 00:48:37 -07:00 committed by GitHub
commit 5057c2d4fb

View File

@ -20,6 +20,7 @@ import (
"fmt" "fmt"
"github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/errdefs"
"github.com/golang/glog"
"golang.org/x/net/context" "golang.org/x/net/context"
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
) )
@ -40,12 +41,31 @@ func (c *criContainerdService) RemoveImage(ctx context.Context, r *runtime.Remov
return &runtime.RemoveImageResponse{}, nil return &runtime.RemoveImageResponse{}, nil
} }
// Exclude out dated image tag.
for i, tag := range image.RepoTags {
cImage, err := c.client.GetImage(ctx, tag)
if err != nil {
if errdefs.IsNotFound(err) {
continue
}
return nil, fmt.Errorf("failed to get image %q: %v", tag, err)
}
desc, err := cImage.Config(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get image %q config descriptor: %v", tag, err)
}
cID := desc.Digest.String()
if cID == image.ID {
continue
}
glog.V(4).Infof("Image tag %q for %q is out dated, it's currently used by %q", tag, image.ID, cID)
image.RepoTags = append(image.RepoTags[:i], image.RepoTags[i+1:]...)
}
// Include all image references, including RepoTag, RepoDigest and id. // Include all image references, including RepoTag, RepoDigest and id.
for _, ref := range append(append(image.RepoTags, image.RepoDigests...), image.ID) { for _, ref := range append(append(image.RepoTags, image.RepoDigests...), image.ID) {
// TODO(random-liu): Containerd should schedule a garbage collection immediately, // TODO(random-liu): Containerd should schedule a garbage collection immediately,
// and we may want to wait for the garbage collection to be over here. // and we may want to wait for the garbage collection to be over here.
// TODO(random-liu): Should check whether descriptor is as expected before delete,
// so as to avoid deleting new reference because of staled reference.
err = c.imageStoreService.Delete(ctx, ref) err = c.imageStoreService.Delete(ctx, ref)
if err == nil || errdefs.IsNotFound(err) { if err == nil || errdefs.IsNotFound(err) {
continue continue