image_unix.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // +build linux freebsd
  2. package images // import "github.com/docker/docker/daemon/images"
  3. import (
  4. "github.com/sirupsen/logrus"
  5. )
  6. // GetContainerLayerSize returns the real size & virtual size of the container.
  7. func (i *ImageService) GetContainerLayerSize(containerID string) (int64, int64) {
  8. var (
  9. sizeRw, sizeRootfs int64
  10. err error
  11. )
  12. // Safe to index by runtime.GOOS as Unix hosts don't support multiple
  13. // container operating systems.
  14. rwlayer, err := i.layerStore.GetRWLayer(containerID)
  15. if err != nil {
  16. logrus.Errorf("Failed to compute size of container rootfs %v: %v", containerID, err)
  17. return sizeRw, sizeRootfs
  18. }
  19. defer i.layerStore.ReleaseRWLayer(rwlayer)
  20. sizeRw, err = rwlayer.Size()
  21. if err != nil {
  22. logrus.Errorf("Driver %s couldn't return diff size of container %s: %s",
  23. i.layerStore.DriverName(), containerID, err)
  24. // FIXME: GetSize should return an error. Not changing it now in case
  25. // there is a side-effect.
  26. sizeRw = -1
  27. }
  28. if parent := rwlayer.Parent(); parent != nil {
  29. sizeRootfs, err = parent.Size()
  30. if err != nil {
  31. sizeRootfs = -1
  32. } else if sizeRw != -1 {
  33. sizeRootfs += sizeRw
  34. }
  35. }
  36. return sizeRw, sizeRootfs
  37. }