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()