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

     1  import sys
     2  import docker
     3  import subprocess
     4  import json
     5  
     6  image_name = sys.argv[1]
     7  
     8  # Layers in RootFS
     9  client = docker.from_env()
    10  image = client.images.get(image_name)
    11  layers_rootfs = []
    12  for l in image.attrs['RootFS']['Layers']:
    13      layers_rootfs.append(l.split('sha256:')[1].rstrip())
    14  #print("Layers' sha256 in [RootFS]")
    15  #for l in layers_rootfs:
    16  #    print(l)
    17  
    18  # Layer ids
    19  layer_ids = []
    20  for l in layers_rootfs:
    21      p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    22      stdout,stderr = p.communicate()
    23      layer_ids.append(stdout.decode("utf-8").split('distribution/diffid-by-digest/sha256/')[1].split(':sha256')[0])
    24  #print("Layers' sha256 in Registry (ex. Dockerhub)")
    25  #for l in layer_ids:
    26  #    print(l)
    27  
    28  # Diff-id
    29  layer_files = []
    30  for l in layers_rootfs:
    31      p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    32      stdout,stderr = p.communicate()
    33      layer_files.append(stdout.decode("utf-8").split('/diff:')[0].split('layerdb/sha256/')[-1])
    34  #print("Layers' file name stored in layerdb")
    35  #for l in layer_files:
    36  #    print(l)
    37  
    38  # Layer sizes
    39  layers_size = []
    40  sum_size = 0
    41  for l in layer_files:
    42      file_name = '/var/lib/docker/image/overlay2/layerdb/sha256/'+l+'/size'
    43      p = subprocess.Popen(['sudo', 'cat', file_name],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
    44      stdout,stderr = p.communicate()
    45      layers_size.append(stdout.decode("utf-8"))
    46      sum_size += int(stdout.decode("utf-8"))
    47  
    48  #print("Layers' sizes (bytes)")
    49  #for l in layers_size:
    50  #    print(l)
    51  #print('Total image size: ' + str(sum_size) + ' bytes')
    52  
    53  
    54  with open('/home/minion/YC/iscc19/Implementation/Algo/Download/compress_image_'+image_name.split(':')[1]+'.json', 'r') as reader:
    55      jf = json.loads(reader.read())
    56      jf['ImageCompressSize'] = jf['ImageSize']
    57      jf['ImageSize'] = str(sum_size)
    58      for l in jf['Layers']:
    59          for l_id in layer_ids:
    60              if l['LayerID'] == l_id[0:12]:
    61                  l['CompressLayerSize'] = l['LayerSize']
    62                  l['LayerSize'] = str(layers_size[layer_ids.index(l_id)])
    63  with open('/home/minion/YC/iscc19/Implementation/Algo/Download/image_'+image_name.split(':')[1]+'.json', 'w') as writer:
    64      data = json.dumps(jf, separators=(',', ': '), indent=4)
    65      writer.write(data)