github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/gateway/Implementation/Algo/Download/findLayerSize.py (about)

     1  import sys
     2  import docker
     3  import subprocess
     4  
     5  # Replace "overlay2" by other file system if your docker use other file system such as "aufs"
     6  
     7  image_name = sys.argv[1]
     8  
     9  # Layers in RootFS
    10  client = docker.from_env()
    11  image = client.images.get(image_name)
    12  layers_rootfs = []
    13  for l in image.attrs['RootFS']['Layers']:
    14      layers_rootfs.append(l.split('sha256:')[1].rstrip())
    15  print("Layers' sha256 in [RootFS]")
    16  for l in layers_rootfs:
    17      print(l)
    18  
    19  # Layer ids
    20  layer_ids = []
    21  for l in layers_rootfs:
    22      p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    23      stdout,stderr = p.communicate()
    24      layer_ids.append(stdout.decode("utf-8").split('distribution/diffid-by-digest/sha256/')[1].split(':sha256')[0])
    25  print("Layers' sha256 in Registry (ex. Dockerhub)")
    26  for l in layer_ids:
    27      print(l)
    28  
    29  # Diff-id
    30  layer_files = []
    31  for l in layers_rootfs:
    32      p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    33      stdout,stderr = p.communicate()
    34      layer_files.append(stdout.decode("utf-8").split('/diff:')[0].split('layerdb/sha256/')[-1])
    35  print("Layers' file name stored in layerdb")
    36  for l in layer_files:
    37      print(l)
    38  
    39  # Layer sizes
    40  layers_size = []
    41  sum_size = 0
    42  for l in layer_files:
    43      file_name = '/var/lib/docker/image/overlay2/layerdb/sha256/'+l+'/size'
    44      p = subprocess.Popen(['sudo', 'cat', file_name],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    45      stdout,stderr = p.communicate()
    46      layers_size.append(stdout.decode("utf-8"))
    47      sum_size += int(stdout.decode("utf-8"))
    48  
    49  # Print progressive layers size in reverse order
    50  layers_size.reverse()
    51  progressive_size = 0
    52  print("Layers' progressive sizes (bytes)")
    53  layer_size_dict = "{'max':"+str(len(layers_size))
    54  for i in range(len(layers_size)):
    55      progressive_size += int(layers_size[i])
    56      layer_size_dict = layer_size_dict + ", '" + str(i+1) + "':" + str(progressive_size)
    57  layer_size_dict = layer_size_dict + "}"
    58  print(layer_size_dict)
    59   
    60  print('Total image size: ' + str(sum_size) + ' bytes')
    61  print('Total image size: ' + str(float(sum_size)/1024/1024/1024) + ' GB')
    62