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