@@ -24,8 +24,15 @@ import (
2424 "github.com/google/go-containerregistry/pkg/name"
2525 v1 "github.com/google/go-containerregistry/pkg/v1"
2626 "github.com/google/go-containerregistry/pkg/v1/tarball"
27+ "github.com/google/go-containerregistry/pkg/v1/types"
2728)
2829
30+ type image struct {
31+ ref name.Reference
32+ opener * imageOpener
33+ tarballImage v1.Image
34+ }
35+
2936type imageOpener struct {
3037 ref name.Reference
3138 ctx context.Context
@@ -85,5 +92,98 @@ func Image(ref name.Reference, options ...Option) (v1.Image, error) {
8592 ctx : o .ctx ,
8693 }
8794
88- return tarball .Image (i .opener (), nil )
95+ return & image {
96+ ref : ref ,
97+ opener : i ,
98+ }, nil
99+ }
100+
101+ func (i * image ) initialize () error {
102+ // Don't re-initialize tarball if already initialized.
103+ if i .tarballImage == nil {
104+ var err error
105+ i .tarballImage , err = tarball .Image (i .opener .opener (), nil )
106+ if err != nil {
107+ return err
108+ }
109+ }
110+ return nil
111+ }
112+
113+ func (i * image ) Layers () ([]v1.Layer , error ) {
114+ if err := i .initialize (); err != nil {
115+ return nil , err
116+ }
117+ return i .tarballImage .Layers ()
118+ }
119+
120+ func (i image ) MediaType () (types.MediaType , error ) {
121+ if err := i .initialize (); err != nil {
122+ return "" , err
123+ }
124+ return i .tarballImage .MediaType ()
125+ }
126+
127+ func (i * image ) Size () (int64 , error ) {
128+ if err := i .initialize (); err != nil {
129+ return 0 , err
130+ }
131+ return i .tarballImage .Size ()
132+ }
133+
134+ func (i * image ) ConfigName () (v1.Hash , error ) {
135+ res , _ , err := i .opener .client .ImageInspectWithRaw (i .opener .ctx , i .ref .String ())
136+ if err != nil {
137+ return v1.Hash {}, err
138+ }
139+ return v1 .NewHash (res .ID )
140+ }
141+
142+ func (i image ) ConfigFile () (* v1.ConfigFile , error ) {
143+ if err := i .initialize (); err != nil {
144+ return nil , err
145+ }
146+ return i .tarballImage .ConfigFile ()
147+ }
148+
149+ func (i image ) RawConfigFile () ([]byte , error ) {
150+ if err := i .initialize (); err != nil {
151+ return nil , err
152+ }
153+ return i .tarballImage .RawConfigFile ()
154+ }
155+
156+ func (i image ) Digest () (v1.Hash , error ) {
157+ if err := i .initialize (); err != nil {
158+ return v1.Hash {}, err
159+ }
160+ return i .tarballImage .Digest ()
161+ }
162+
163+ func (i image ) Manifest () (* v1.Manifest , error ) {
164+ if err := i .initialize (); err != nil {
165+ return nil , err
166+ }
167+ return i .tarballImage .Manifest ()
168+ }
169+
170+ func (i image ) RawManifest () ([]byte , error ) {
171+ if err := i .initialize (); err != nil {
172+ return nil , err
173+ }
174+ return i .tarballImage .RawManifest ()
175+ }
176+
177+ func (i image ) LayerByDigest (h v1.Hash ) (v1.Layer , error ) {
178+ if err := i .initialize (); err != nil {
179+ return nil , err
180+ }
181+ return i .tarballImage .LayerByDigest (h )
182+ }
183+
184+ func (i image ) LayerByDiffID (h v1.Hash ) (v1.Layer , error ) {
185+ if err := i .initialize (); err != nil {
186+ return nil , err
187+ }
188+ return i .tarballImage .LayerByDigest (h )
89189}
0 commit comments