Move image creation after unpack
@@ -338,20 +338,29 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (Image
}
}
- imgrec := images.Image{
+ img := &image{
+ client: c,
+ i: images.Image{
Name: name,
Target: desc,
Labels: pullCtx.Labels,
+ },
+ }
+
+ if pullCtx.Unpack {
+ if err := img.Unpack(ctx, pullCtx.Snapshotter); err != nil {
+ errors.Wrapf(err, "failed to unpack image on snapshotter %s", pullCtx.Snapshotter)
+ }
}
is := c.ImageService()
for {
- if created, err := is.Create(ctx, imgrec); err != nil {
+ if created, err := is.Create(ctx, img.i); err != nil {
if !errdefs.IsAlreadyExists(err) {
return nil, err
}
- updated, err := is.Update(ctx, imgrec)
+ updated, err := is.Update(ctx, img.i)
if err != nil {
// if image was removed, try create again
if errdefs.IsNotFound(err) {
@@ -360,24 +369,13 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (Image
return nil, err
}
- imgrec = updated
+ img.i = updated
} else {
- imgrec = created
- }
- break
- }
-
- img := &image{
- client: c,
- i: imgrec,
- }
- if pullCtx.Unpack {
- if err := img.Unpack(ctx, pullCtx.Snapshotter); err != nil {
- errors.Wrapf(err, "failed to unpack image on snapshotter %s", pullCtx.Snapshotter)
- }
+ img.i = created
}
return img, nil
}
+}
// Push uploads the provided content to a remote resource
func (c *Client) Push(ctx context.Context, ref string, desc ocispec.Descriptor, opts ...RemoteOpt) error {
