import subprocess import json def health(): result = subprocess.run(['docker', 'ps', '-a', '--format', 'json', '--no-trunc'], stdout=subprocess.PIPE) result = str(result.stdout)[:-1].replace("b'", "").replace('\\"', '').replace('\\', '').replace("u003e", ">").split('{"Command"') ret_dict = {} for container in result: if container != "": j = '{"Command"'+container[:-1] data = json.loads(j) ret_dict[data["Names"]] = {} if data["State"] == "running": ret_dict[data["Names"]]["status"] = 1 else: ret_dict[data["Names"]]["status"] = 0 if "unhealthy" in data["Status"]: ret_dict[data["Names"]]["health"] = 3 elif "Restarting" in data["Status"]: ret_dict[data["Names"]]["health"] = 2 elif "healthy" in data["Status"]: ret_dict[data["Names"]]["health"] = 0 elif "starting" in data["Status"]: ret_dict[data["Names"]]["health"] = 1 else: ret_dict[data["Names"]]["health"] = -1 return ret_dict def _sizeConv(value): number = "" for d in value: if d.isdigit(): number += d elif d == '.': number += d else: continue number = float(number) if "TB" in value: return number * 10**12 elif "GB" in value: return number * 10**9 elif "MB" in value: return number * 10**6 elif "KB" in value: return number * 10**3 else: return number def getSize(): result = subprocess.run(['docker', 'system', 'df', '--format', 'json'], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1].split('\n') size = {} for line in result: a = json.loads(line) size[a["Type"]] = {} size[a["Type"]]["used"] = _sizeConv(a["Size"]) size[a["Type"]]["reclaimable"] = _sizeConv(a["Reclaimable"].split(" ")[0]) size[a["Type"]]["count_total"] = a["TotalCount"] size[a["Type"]]["count_active"] = a["Active"] return size def getInfo(): docker = {} result = subprocess.run(['docker', 'system', 'info', '--format', 'json'], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1] info = json.loads(result) docker["version"] = info["ServerVersion"] result = subprocess.run(['docker', 'system', 'df', '-v', '--format', 'json'], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8') info = json.loads(result) docker["images"] = {} docker["containers"] = {} docker["volumes"] = {} docker["buildcache"] = {} for image in info["Images"]: docker["images"][image["ID"]] = {} docker["images"][image["ID"]]["containers"] = image["Containers"] docker["images"][image["ID"]]["created"] = image["CreatedSince"] docker["images"][image["ID"]]["repository"] = image["Repository"] docker["images"][image["ID"]]["size"] = _sizeConv(image["Size"]) docker["images"][image["ID"]]["unique_size"] = image["UniqueSize"] for container in info["Containers"]: docker["containers"][container["ID"]] = {} docker["containers"][container["ID"]]["created"] = container["CreatedAt"] docker["containers"][container["ID"]]["image"] = container["Image"] docker["containers"][container["ID"]]["volumes"] = container["LocalVolumes"] docker["containers"][container["ID"]]["mounts"] = container["Mounts"] try: docker["containers"][container["ID"]]["name"] = container["Names"] except: docker["containers"][container["ID"]]["name"] = "" try: docker["containers"][container["ID"]]["networks"] = container["Networks"] except: docker["containers"][container["ID"]]["networks"] = "" docker["containers"][container["ID"]]["runtime"] = container["RunningFor"] docker["containers"][container["ID"]]["state"] = container["State"] docker["containers"][container["ID"]]["size"] = _sizeConv(container["Size"]) docker["containers"][container["ID"]]["status"] = container["Status"] for volume in info["Volumes"]: docker["volumes"][volume["Name"]] = {} docker["volumes"][volume["Name"]]["driver"] = volume["Driver"] docker["volumes"][volume["Name"]]["links"] = volume["Links"] docker["volumes"][volume["Name"]]["mountpoint"] = volume["Mountpoint"] docker["volumes"][volume["Name"]]["size"] = _sizeConv(volume["Size"]) for build in info["BuildCache"]: docker["buildcache"][build["ID"]] = {} docker["buildcache"][build["ID"]]["type"] = build["CacheType"] docker["buildcache"][build["ID"]]["created"] = build["CreatedSince"] docker["buildcache"][build["ID"]]["in_use"] = build["InUse"] docker["buildcache"][build["ID"]]["last_use"] = build["LastUsedSince"] docker["buildcache"][build["ID"]]["shared"] = build["Shared"] docker["buildcache"][build["ID"]]["size"] = _sizeConv(build["Size"]) docker["buildcache"][build["ID"]]["use_count"] = build["UsageCount"] return docker if __name__ == "__main__": print(json.dumps(getSize())) print(json.dumps(getInfo())) #print(health())