| //go:build linux || freebsd | |
| package images // import "github.com/docker/docker/daemon/images" | |
| import ( | |
| "context" | |
| "github.com/containerd/log" | |
| "github.com/docker/docker/image" | |
| "github.com/docker/docker/layer" | |
| ) | |
| // GetLayerFolders returns the layer folders from an image RootFS | |
| func (i *ImageService) GetLayerFolders(img *image.Image, rwLayer layer.RWLayer, containerID string) ([]string, error) { | |
| // Windows specific | |
| panic("not implemented") | |
| } | |
| // GetContainerLayerSize returns the real size & virtual size of the container. | |
| func (i *ImageService) GetContainerLayerSize(ctx context.Context, containerID string) (int64, int64, error) { | |
| var ( | |
| sizeRw, sizeRootfs int64 | |
| err error | |
| ) | |
| // Safe to index by runtime.GOOS as Unix hosts don't support multiple | |
| // container operating systems. | |
| rwlayer, err := i.layerStore.GetRWLayer(containerID) | |
| if err != nil { | |
| log.G(ctx).Errorf("Failed to compute size of container rootfs %v: %v", containerID, err) | |
| return sizeRw, sizeRootfs, nil | |
| } | |
| defer i.layerStore.ReleaseRWLayer(rwlayer) | |
| sizeRw, err = rwlayer.Size() | |
| if err != nil { | |
| log.G(ctx).Errorf("Driver %s couldn't return diff size of container %s: %s", | |
| i.layerStore.DriverName(), containerID, err) | |
| // FIXME: GetSize should return an error. Not changing it now in case | |
| // there is a side-effect. | |
| sizeRw = -1 | |
| } | |
| if parent := rwlayer.Parent(); parent != nil { | |
| sizeRootfs = parent.Size() | |
| if sizeRw != -1 { | |
| sizeRootfs += sizeRw | |
| } | |
| } | |
| return sizeRw, sizeRootfs, nil | |
| } |