| 286 | } |
| 287 | |
| 288 | func (c *Client) createNewImage(ctx context.Context, img images.Image) (images.Image, error) { |
| 289 | ctx, span := tracing.StartSpan(ctx, tracing.Name(pullSpanPrefix, "pull.createNewImage")) |
| 290 | defer span.End() |
| 291 | is := c.ImageService() |
| 292 | for { |
| 293 | if created, err := is.Create(ctx, img); err != nil { |
| 294 | if !errdefs.IsAlreadyExists(err) { |
| 295 | return images.Image{}, err |
| 296 | } |
| 297 | |
| 298 | updated, err := is.Update(ctx, img) |
| 299 | if err != nil { |
| 300 | // if image was removed, try create again |
| 301 | if errdefs.IsNotFound(err) { |
| 302 | continue |
| 303 | } |
| 304 | return images.Image{}, err |
| 305 | } |
| 306 | |
| 307 | img = updated |
| 308 | } else { |
| 309 | img = created |
| 310 | } |
| 311 | |
| 312 | return img, nil |
| 313 | } |
| 314 | } |