disk_usage.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package daemon // import "github.com/docker/docker/daemon"
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/docker/docker/api/server/router/system"
  6. "github.com/docker/docker/api/types"
  7. "golang.org/x/sync/errgroup"
  8. )
  9. // ContainerDiskUsage returns information about container data disk usage.
  10. func (daemon *Daemon) ContainerDiskUsage(ctx context.Context) ([]*types.Container, error) {
  11. ch := daemon.usage.DoChan("ContainerDiskUsage", func() (interface{}, error) {
  12. // Retrieve container list
  13. containers, err := daemon.Containers(&types.ContainerListOptions{
  14. Size: true,
  15. All: true,
  16. })
  17. if err != nil {
  18. return nil, fmt.Errorf("failed to retrieve container list: %v", err)
  19. }
  20. return containers, nil
  21. })
  22. select {
  23. case <-ctx.Done():
  24. return nil, ctx.Err()
  25. case res := <-ch:
  26. if res.Err != nil {
  27. return nil, res.Err
  28. }
  29. return res.Val.([]*types.Container), nil
  30. }
  31. }
  32. // SystemDiskUsage returns information about the daemon data disk usage.
  33. // Callers must not mutate contents of the returned fields.
  34. func (daemon *Daemon) SystemDiskUsage(ctx context.Context, opts system.DiskUsageOptions) (*types.DiskUsage, error) {
  35. eg, ctx := errgroup.WithContext(ctx)
  36. var containers []*types.Container
  37. if opts.Containers {
  38. eg.Go(func() error {
  39. var err error
  40. containers, err = daemon.ContainerDiskUsage(ctx)
  41. return err
  42. })
  43. }
  44. var (
  45. images []*types.ImageSummary
  46. layersSize int64
  47. )
  48. if opts.Images {
  49. eg.Go(func() error {
  50. var err error
  51. images, err = daemon.imageService.ImageDiskUsage(ctx)
  52. return err
  53. })
  54. eg.Go(func() error {
  55. var err error
  56. layersSize, err = daemon.imageService.LayerDiskUsage(ctx)
  57. return err
  58. })
  59. }
  60. var volumes []*types.Volume
  61. if opts.Volumes {
  62. eg.Go(func() error {
  63. var err error
  64. volumes, err = daemon.volumes.LocalVolumesSize(ctx)
  65. return err
  66. })
  67. }
  68. if err := eg.Wait(); err != nil {
  69. return nil, err
  70. }
  71. return &types.DiskUsage{
  72. LayersSize: layersSize,
  73. Containers: containers,
  74. Volumes: volumes,
  75. Images: images,
  76. }, nil
  77. }