Как я могу получить процентное соотношение изображения в Docker?
Это я использую docker pull
по команде или API Docker-Py c.pull(repository, tag=None, stream=False)
,
Как я могу получить тянуть (скачать) прогресс этого изображения?
1 ответ
docker-py предоставляет клиентский API извлечения, который обеспечивает завершенное и общее количество. Вы можете разделить их, чтобы получить процент, который вам нужен.
Например, этот фрагмент:
import docker
client = docker.from_env()
resp = client.api.pull(image_name, stream=True, decode=True)
for line in resp:
print(json.dumps(line, indent=4))
будет печатать:
{
"status": "Downloading",
"progressDetail": {
"current": 12253570,
"total": 12627702
},
"progress": "[================================================> ] 12.25MB/12.63MB",
"id": "14e6ed0b1573"
}
{
"status": "Downloading",
"progressDetail": {
"current": 12384642,
"total": 12627702
},
"progress": "[=================================================> ] 12.38MB/12.63MB",
"id": "14e6ed0b1573"
}
Для каждого сообщения вы можете получить текущее/общее значение, чтобы получить желаемую функциональность.
Я написал программу с богатой библиотекой, чтобы показать индикатор выполнения. Он может печатать прогресс для каждого слоя отдельно (в том числе, если он предназначен для загрузки или извлечения этого слоя).
import docker
from rich.progress import Progress
tasks = {}
# Show task progress (red for download, green for extract)
def show_progress(line, progress):
if line['status'] == 'Downloading':
id = f'[red][Download {line["id"]}]'
elif line['status'] == 'Extracting':
id = f'[green][Extract {line["id"]}]'
else:
# skip other statuses
return
if id not in tasks.keys():
tasks[id] = progress.add_task(f"{id}", total=line['progressDetail']['total'])
else:
progress.update(tasks[id], completed=line['progressDetail']['current'])
def image_pull(image_name):
print(f'Pulling image: {image_name}')
with Progress() as progress:
client = docker.from_env()
resp = client.api.pull(image_name, stream=True, decode=True)
for line in resp:
show_progress(line, progress)
if __name__ == '__main__':
# Pull a large image
IMAGE_NAME = 'bitnami/pytorch'
image_pull(IMAGE_NAME)
Результат для этого выглядит как на прикрепленном изображении. Он показывает статусы загрузки красным цветом, а статус извлечения — зеленым.
Программа Python для отображения индикатора выполнения загрузки образа докера