dotcloud/docker

View on GitHub
daemon/images/image_unix.go

Summary

Maintainability
A
0 mins
Test Coverage
//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
}