github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/gateway/Implementation/Algo/Download/image_json.py (about) 1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 __author__ = 'YuJung Wang' 4 __date__ = '2020/06' 5 6 import sys 7 import docker 8 import subprocess 9 10 if __name__ == '__main__': 11 image_name = sys.argv[1] 12 tag_name = sys.argv[2] 13 out_name = f'image_{tag_name}.json' 14 15 # Layers in RootFS 16 client = docker.from_env() 17 image = client.images.get(image_name) 18 layers_rootfs = [] 19 for l in image.attrs['RootFS']['Layers']: 20 layers_rootfs.append(l.split('sha256:')[1].rstrip()) 21 #print("Layers' sha256 in [RootFS]") 22 #for l in layers_rootfs: 23 # print(l) 24 25 # Layer ids 26 # Replace "overlay2" by other file system 27 # if your docker use other file system such as "aufs" 28 layer_ids = [] 29 for l in layers_rootfs: 30 p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 31 stdout,stderr = p.communicate() 32 layer_ids.append(stdout.decode("utf-8").split('distribution/diffid-by-digest/sha256/')[1].split(':sha256')[0]) 33 print("Layers' sha256 in Registry (ex. Dockerhub)") 34 for l in layer_ids: 35 print(l[:12]) 36 37 # Diff-id 38 layer_files = [] 39 for l in layers_rootfs: 40 p = subprocess.Popen(['sudo', 'grep', '-r', l, '/var/lib/docker/image/overlay2'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 41 stdout,stderr = p.communicate() 42 layer_files.append(stdout.decode("utf-8").split('/diff:')[0].split('layerdb/sha256/')[-1]) 43 #print("Layers' file name stored in layerdb") 44 #for l in layer_files: 45 # print(l) 46 47 # Layer sizes 48 layers_size = [] 49 sum_size = 0 50 for l in layer_files: 51 file_name = '/var/lib/docker/image/overlay2/layerdb/sha256/'+l+'/size' 52 p = subprocess.Popen(['sudo', 'cat', file_name],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 53 stdout,stderr = p.communicate() 54 layers_size.append(stdout.decode("utf-8")) 55 sum_size += int(stdout.decode("utf-8")) 56 57 58 # Write file 59 out_file = open(out_name, 'w') 60 # Head 61 out_file.write(f'{{\n "Layers": [\n') 62 # Layers 63 for i in range(len(layers_size)-1): 64 out_file.write(f' {{\n "CompressLayerSize": "",\n') 65 out_file.write(f' "LayerSize": "{layers_size[i]}",\n') 66 out_file.write(f' "LayerID": "{layer_ids[i][:12]}"\n }},\n') 67 out_file.write(f' {{\n "CompressLayerSize": "",\n') 68 out_file.write(f' "LayerSize": "{layers_size[-1]}",\n') 69 out_file.write(f' "LayerID": "{layer_ids[-1][:12]}"\n }}\n') 70 71 # End 72 out_file.write(f' ],\n "ImageName": "{tag_name}",\n') 73 out_file.write(f' "ImageSize": "{sum_size}",\n') 74 out_file.write(f' "ImageCompressSize": ""\n}}') 75 out_file.close()