@@ -18,6 +18,10 @@ package imageinspector
1818
1919import (
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+ }
0 commit comments