| package images // import "github.com/docker/docker/daemon/images" |
| |
| import ( |
| "context" |
| "encoding/json" |
| "fmt" |
| |
| "github.com/containerd/log" |
| "github.com/docker/docker/api/types/backend" |
| "github.com/docker/docker/builder" |
| "github.com/docker/docker/image" |
| "github.com/docker/docker/image/cache" |
| "github.com/docker/docker/layer" |
| ) |
| |
| type cacheAdaptor struct { |
| is *ImageService |
| } |
| |
| func (c cacheAdaptor) Get(id image.ID) (*image.Image, error) { |
| return c.is.imageStore.Get(id) |
| } |
| |
| func (c cacheAdaptor) GetByRef(ctx context.Context, refOrId string) (*image.Image, error) { |
| return c.is.GetImage(ctx, refOrId, backend.GetImageOpts{}) |
| } |
| |
| func (c cacheAdaptor) SetParent(target, parent image.ID) error { |
| return c.is.imageStore.SetParent(target, parent) |
| } |
| |
| func (c cacheAdaptor) GetParent(target image.ID) (image.ID, error) { |
| return c.is.imageStore.GetParent(target) |
| } |
| |
| func (c cacheAdaptor) IsBuiltLocally(target image.ID) (bool, error) { |
| return c.is.imageStore.IsBuiltLocally(target) |
| } |
| |
| func (c cacheAdaptor) Children(imgID image.ID) []image.ID { |
| // Not FROM scratch |
| if imgID != "" { |
| return c.is.imageStore.Children(imgID) |
| } |
| images := c.is.imageStore.Map() |
| |
| var siblings []image.ID |
| for id, img := range images { |
| if img.Parent != "" { |
| continue |
| } |
| |
| builtLocally, err := c.is.imageStore.IsBuiltLocally(id) |
| if err != nil { |
| log.G(context.TODO()).WithFields(log.Fields{ |
| "error": err, |
| "id": id, |
| }).Warn("failed to check if image was built locally") |
| continue |
| } |
| if !builtLocally { |
| continue |
| } |
| |
| siblings = append(siblings, id) |
| } |
| return siblings |
| } |
| |
| func (c cacheAdaptor) Create(parent *image.Image, image image.Image, _ layer.DiffID) (image.ID, error) { |
| data, err := json.Marshal(image) |
| if err != nil { |
| return "", fmt.Errorf("failed to marshal image config: %w", err) |
| } |
| imgID, err := c.is.imageStore.Create(data) |
| if err != nil { |
| return "", err |
| } |
| |
| if parent != nil { |
| if err := c.is.imageStore.SetParent(imgID, parent.ID()); err != nil { |
| return "", fmt.Errorf("failed to set parent for %v to %v: %w", imgID, parent.ID(), err) |
| } |
| } |
| |
| return imgID, err |
| } |
| |
| // MakeImageCache creates a stateful image cache. |
| func (i *ImageService) MakeImageCache(ctx context.Context, sourceRefs []string) (builder.ImageCache, error) { |
| return cache.New(ctx, cacheAdaptor{i}, sourceRefs) |
| } |