Skip to content

Commit 5df6a98

Browse files
committed
feature: support to print snapshot info
Signed-off-by: ningmingxiao <ning.mingxiao@zte.com.cn>
1 parent 9145d0f commit 5df6a98

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

pkg/imageinspector/imageinspector.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ package imageinspector
1818

1919
import (
2020
"context"
21+
"crypto/sha256"
22+
"fmt"
23+
24+
"github.com/opencontainers/go-digest"
2125

2226
containerd "github.com/containerd/containerd/v2/client"
2327
"github.com/containerd/containerd/v2/core/images"
@@ -56,6 +60,18 @@ func Inspect(ctx context.Context, client *containerd.Client, image images.Image,
5660
} else {
5761
n.ImageConfigDesc = imageConfigDesc
5862
n.ImageConfig = imageConfig
63+
diffIDS := imageConfig.RootFS.DiffIDs
64+
chainIDS := calculateChainID(diffIDS)
65+
snapshots := make([]snapshots.Info, len(chainIDS))
66+
for i, id := range chainIDS {
67+
snapInfo, err := snapshotter.Stat(ctx, id.String())
68+
if err == nil {
69+
snapshots[i] = snapInfo
70+
} else {
71+
log.G(ctx).WithError(err).WithField("id", image.Name).Warnf("failed to get snapshot %s info", id.String())
72+
}
73+
}
74+
n.Snapshots = snapshots
5975
}
6076
n.Size, err = imgutil.UnpackedImageSize(ctx, snapshotter, img)
6177
if err != nil {
@@ -65,3 +81,17 @@ func Inspect(ctx context.Context, client *containerd.Client, image images.Image,
6581

6682
return n, nil
6783
}
84+
85+
func calculateChainID(diffIDs []digest.Digest) []digest.Digest {
86+
if len(diffIDs) == 0 {
87+
return nil
88+
}
89+
chainIDs := make([]digest.Digest, len(diffIDs))
90+
chainIDs[0] = diffIDs[0]
91+
for i := 1; i < len(diffIDs); i++ {
92+
combined := chainIDs[i-1] + " " + diffIDs[i]
93+
hash := sha256.Sum256([]byte(combined))
94+
chainIDs[i] = digest.FromString(fmt.Sprintf("sha256:%x", hash))
95+
}
96+
return chainIDs
97+
}

pkg/inspecttypes/native/image.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
2121

2222
"github.com/containerd/containerd/v2/core/images"
23+
"github.com/containerd/containerd/v2/core/snapshots"
2324
)
2425

2526
// Image corresponds to a containerd-native image object.
@@ -34,4 +35,5 @@ type Image struct {
3435
ImageConfigDesc ocispec.Descriptor `json:"ImageConfigDesc"`
3536
ImageConfig ocispec.Image `json:"ImageConfig"`
3637
Size int64 `json:"size"`
38+
Snapshots []snapshots.Info `json:"Snapshots,omitempty"`
3739
}

0 commit comments

Comments
 (0)