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)