Skip to content

Commit ece8e8c

Browse files
committed
feat(daemon): tarball lazy loading
1 parent c5dea0c commit ece8e8c

File tree

2 files changed

+102
-1
lines changed

2 files changed

+102
-1
lines changed

pkg/v1/daemon/image.go

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
2936
type 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
}

pkg/v1/daemon/options.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,5 @@ type Client interface {
9999
ImageSave(context.Context, []string) (io.ReadCloser, error)
100100
ImageLoad(context.Context, io.Reader, bool) (types.ImageLoadResponse, error)
101101
ImageTag(context.Context, string, string) error
102+
ImageInspectWithRaw(context.Context, string) (types.ImageInspect, []byte, error)
102103
}

0 commit comments

Comments
 (0)