Как захватить статус docker pull

#docker #docker-image #dockerpy #docker-pull

#docker #docker-изображение #dockerpy #docker-pull

Вопрос:

Я пытаюсь опубликовать статус загрузки изображения docker в интерфейсе в режиме реального времени. В настоящее время он может просто сказать, что docker pull продолжается. Я понимаю, что может быть несколько слоев разных размеров, и размеры слоев, которые еще не начали загружаться, могут быть неизвестны. Итак, я думаю о том, чтобы показать, сколько слоев существует, и текущее состояние загрузки слоев, которые уже начали загружаться. Знаете ли вы, как захватить данные, которые отображаются на консоли терминала, когда вы это делаете docker pull <image> ? Моя программа написана на Python, поэтому я хотел бы получить данные в коде python и отправить их во внешний интерфейс. Я проверил документацию docker, но не нашел ни одного API, который поддерживает это. Похоже, что пока нет общедоступного API, который поддерживает эту функциональность.

Есть ли у вас какие-либо другие подходы, которые могут реализовать мою цель?

Любые предложения приветствуются и приветствуются!

Спасибо!

Ответ №1:

Для этого вам нужен низкоуровневый pull() вызов (docs). Вот один из примеров:

 >>> import docker
>>> import json
>>> client = docker.APIClient(base_url='unix://var/run/docker.sock')
>>> for line in client.pull('busybox', stream=True, decode=True):
...     print(json.dumps(line, indent=4))
{
    "status": "Pulling from library/busybox",
    "id": "latest"
}
{
    "status": "Pulling fs layer",
    "progressDetail": {},
    "id": "e5d9363303dd"
}
{
    "status": "Downloading",
    "progressDetail": {
        "current": 8635,
        "total": 764663
    },
    "progress": "[>                                                  ]  8.635kB/764.7kB",
    "id": "e5d9363303dd"
}
{
    "status": "Downloading",
    "progressDetail": {
        "current": 764663,
        "total": 764663
    },
    "progress": "[==================================================>]  764.7kB/764.7kB",
    "id": "e5d9363303dd"
}
{
    "status": "Verifying Checksum",
    "progressDetail": {},
    "id": "e5d9363303dd"
}
{
    "status": "Download complete",
    "progressDetail": {},
    "id": "e5d9363303dd"
}
{
    "status": "Extracting",
    "progressDetail": {
        "current": 32768,
        "total": 764663
    },
    "progress": "[==>                                                ]  32.77kB/764.7kB",
    "id": "e5d9363303dd"
}
{
    "status": "Extracting",
    "progressDetail": {
        "current": 764663,
        "total": 764663
    },
    "progress": "[==================================================>]  764.7kB/764.7kB",
    "id": "e5d9363303dd"
}
{
    "status": "Extracting",
    "progressDetail": {
        "current": 764663,
        "total": 764663
    },
    "progress": "[==================================================>]  764.7kB/764.7kB",
    "id": "e5d9363303dd"
}
{
    "status": "Pull complete",
    "progressDetail": {},
    "id": "e5d9363303dd"
}
{
    "status": "Digest: sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f"
}
{
    "status": "Status: Downloaded newer image for busybox:latest"
}