66325f7271
The existing API ImageService.GetLayerFolders didn't have access to the ID of the container, and once we have that, the snapshotter Mounts API provides all the information we need here. Signed-off-by: Paul "TBBle" Hampson <Paul.Hampson@Pobox.com> Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
42 lines
1.4 KiB
Go
42 lines
1.4 KiB
Go
package images
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/docker/docker/image"
|
|
"github.com/docker/docker/layer"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// GetContainerLayerSize returns real size & virtual size
|
|
func (i *ImageService) GetContainerLayerSize(ctx context.Context, containerID string) (int64, int64, error) {
|
|
// TODO Windows
|
|
return 0, 0, nil
|
|
}
|
|
|
|
// GetLayerFolders returns the layer folders from an image RootFS
|
|
func (i *ImageService) GetLayerFolders(img *image.Image, rwLayer layer.RWLayer, containerID string) ([]string, error) {
|
|
folders := []string{}
|
|
rd := len(img.RootFS.DiffIDs)
|
|
for index := 1; index <= rd; index++ {
|
|
// FIXME: why does this mutate the RootFS?
|
|
img.RootFS.DiffIDs = img.RootFS.DiffIDs[:index]
|
|
if err := image.CheckOS(img.OperatingSystem()); err != nil {
|
|
return nil, errors.Wrapf(err, "cannot get layerpath for ImageID %s", img.RootFS.ChainID())
|
|
}
|
|
layerPath, err := layer.GetLayerPath(i.layerStore, img.RootFS.ChainID())
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed to get layer path from graphdriver %s for ImageID %s", i.layerStore, img.RootFS.ChainID())
|
|
}
|
|
// Reverse order, expecting parent first
|
|
folders = append([]string{layerPath}, folders...)
|
|
}
|
|
if rwLayer == nil {
|
|
return nil, errors.New("RWLayer is unexpectedly nil")
|
|
}
|
|
m, err := rwLayer.Metadata()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to get layer metadata")
|
|
}
|
|
return append(folders, m["dir"]), nil
|
|
}
|