Python библиотека-обертка для утилиты skopeo с поддержкой парсинга прогресса
Project description
Skopeo Wrapper
Python библиотека-обертка для утилиты skopeo с поддержкой парсинга прогресса операций.
Возможности
- 🚀 Парсинг прогресса: Извлечение информации о ходе выполнения операций skopeo
- 📦 Операции с образами: Копирование, инспекция, удаление образов
- 🔄 Callback-функции: Возможность отслеживания прогресса в реальном времени
- ⚡ Асинхронный мониторинг: Неблокирующий мониторинг вывода skopeo
- 🛡️ Обработка ошибок: Корректная обработка ошибок и исключений
- 🖥️ CLI интерфейс: Консольный интерфейс для быстрого использования
- 📊 Prometheus метрики: Полная поддержка метрик для мониторинга
- 📈 Grafana дашборды: Готовые дашборды для визуализации
Установка
Требования
- Python 3.7+
- Утилита skopeo (установлена в системе)
- Рекомендуется: skopeo версии 1.18+ для лучшей совместимости
Установка skopeo
Быстрая установка (рекомендуемая версия)
# Ubuntu/Debian
sudo apt update && sudo apt install skopeo
# CentOS/RHEL
sudo yum install skopeo
# Fedora
sudo dnf install skopeo
Установка skopeo 1.18 из исходников
# Установка зависимостей
sudo apt install -y golang-go libgpgme-dev pkg-config
# Скачивание и сборка
wget https://github.com/containers/skopeo/archive/refs/tags/v1.18.0.tar.gz
tar -xzf v1.18.0.tar.gz
cd skopeo-1.18.0
make bin/skopeo
sudo cp bin/skopeo /usr/local/bin/skopeo
Установка библиотеки
Из PyPI (когда будет опубликована)
pip install skopeo-wrapper
Из исходников
# Клонирование репозитория
git clone https://github.com/your-username/skopeo-wrapper.git
cd skopeo-wrapper
# Установка в режиме разработки
pip install -e .
# Или установка зависимостей
pip install -r requirements.txt
Использование
Python API
Базовое использование
from skopeo_wrapper import SkopeoWrapper, create_progress_callback
# Создание экземпляра
skopeo = SkopeoWrapper()
# Копирование образа с отображением прогресса
success, stdout, stderr = skopeo.copy(
source="docker://docker.io/library/alpine:latest",
destination="dir:/tmp/alpine_image",
progress_callback=create_progress_callback(show_progress=True)
)
if success:
print("Копирование завершено успешно!")
else:
print(f"Ошибка: {stderr}")
Детальный мониторинг прогресса
from skopeo_wrapper import SkopeoWrapper, ProgressInfo
def detailed_progress_callback(progress: ProgressInfo):
print(f"Этап: {progress.current_step}")
print(f"Прогресс: {progress.parser.get_progress_percentage():.1f}%")
if progress.current_blob:
print(f"Текущий blob: {progress.current_blob.sha256[:12]}...")
if progress.current_blob.size:
print(f"Размер: {progress.current_blob.size} bytes")
skopeo = SkopeoWrapper()
success, stdout, stderr = skopeo.copy(
source="docker://docker.io/library/ubuntu:22.04",
destination="dir:/tmp/ubuntu_image",
progress_callback=detailed_progress_callback
)
Операции с образами
# Инспекция образа
success, image_info, stderr = skopeo.inspect(
image="docker://docker.io/library/alpine:latest"
)
if success:
import json
info = json.loads(image_info)
print(f"Архитектура: {info['Architecture']}")
print(f"ОС: {info['Os']}")
# Получение digest манифеста
success, digest, stderr = skopeo.get_manifest_digest(
image="docker://docker.io/library/alpine:latest"
)
if success:
print(f"Digest: {digest.strip()}")
CLI интерфейс
# Копирование образа
skopeo-wrapper copy docker://alpine:latest dir:/tmp/alpine --progress
# Инспекция образа
skopeo-wrapper inspect docker://ubuntu:22.04 --json
# Удаление образа
skopeo-wrapper delete docker://alpine:latest
# Получение digest манифеста
skopeo-wrapper manifest-digest docker://nginx:alpine
# Справка
skopeo-wrapper --help
Prometheus метрики
Базовое использование метрик
from skopeo_wrapper import SkopeoWrapper
# Создание с включенными метриками (по умолчанию)
skopeo = SkopeoWrapper(enable_metrics=True)
# Выполнение операций
success, stdout, stderr = skopeo.copy(
source="docker://alpine:latest",
destination="dir:/tmp/alpine"
)
# Получение метрик
metrics = skopeo.get_metrics()
print(metrics)
Детальное отслеживание операций
from skopeo_wrapper import SkopeoWrapper, OperationTracker
skopeo = SkopeoWrapper(enable_metrics=True)
# Использование OperationTracker для детального отслеживания
with OperationTracker("copy", skopeo.metrics,
source="docker://alpine:latest",
destination="dir:/tmp/alpine") as tracker:
# Имитация обработки blob'ов
tracker.add_blob(1024000) # 1MB
tracker.add_blob(2048000) # 2MB
Доступные метрики
skopeo_operations_total- Общее количество операций по типам и статусамskopeo_operation_duration_seconds- Время выполнения операцийskopeo_blobs_processed_total- Количество обработанных blob'овskopeo_blob_size_bytes- Размеры blob'овskopeo_active_operations- Текущие активные операцииskopeo_operation_errors_total- Количество ошибок по типамskopeo_source_operations_total- Операции по типам источниковskopeo_destination_operations_total- Операции по типам назначений
API Reference
SkopeoWrapper
Основной класс для работы с skopeo.
Методы
copy(source, destination, progress_callback=None, timeout=None)- Копирование образаinspect(image, progress_callback=None, timeout=None)- Получение информации об образеdelete(image, progress_callback=None, timeout=None)- Удаление образаget_manifest_digest(image, progress_callback=None, timeout=None)- Получение digest манифеста
Параметры
source/destination/image- URL образа или путьprogress_callback- Функция для обработки прогрессаtimeout- Таймаут операции в секундах
ProgressInfo
Информация о прогрессе операции.
Атрибуты
operation- Тип операцииcurrent_step- Текущий этап выполненияcurrent_blob- Информация о текущем blobmanifest_written- Манифест записанsignatures_stored- Подписи сохраненыerror- Сообщение об ошибкеcompleted- Операция завершена
BlobInfo
Информация о blob-объекте.
Атрибуты
sha256- SHA256 хеш blobsize- Размер в байтахstatus- Статус обработки
SkopeoMetrics
Класс для управления Prometheus метриками.
Методы
record_operation_start(operation)- Записывает начало операцииrecord_operation_end(operation, success, start_time, ...)- Записывает завершение операцииrecord_error(operation, error_type)- Записывает ошибку операцииrecord_blob_processed(operation, blob_size)- Записывает обработку blob'аget_metrics()- Возвращает метрики в формате Prometheusget_metrics_dict()- Возвращает метрики в виде словаря
OperationTracker
Контекстный менеджер для автоматического отслеживания операций.
Методы
add_blob(blob_size)- Добавляет информацию о blob'е
Примеры вывода
Копирование образа (skopeo 1.18)
🔍 getting_signatures: 10.0%
📦 copying_blob: 50.0%
(blob: af6eca94c810...)
📦 copying_config: 75.0%
(config: 392fa14dddd0...)
📝 writing_manifest: 90.0%
✅ Операция завершена успешно
Копирование образа (старые версии)
🔍 getting_signatures: 10.0%
📦 copying_blob: 50.0%
(blob: 2d35ebdb57d9... 1234567 bytes)
📝 writing_manifest: 85.0%
🔐 storing_signatures: 95.0%
✅ Операция завершена успешно
Инспекция образа
🔍 getting_signatures: 10.0%
✅ Операция завершена успешно
Примеры метрик Prometheus
Базовые метрики операций
# HELP skopeo_operations_total Общее количество операций skopeo
# TYPE skopeo_operations_total counter
skopeo_operations_total{operation="copy",status="success"} 15
skopeo_operations_total{operation="copy",status="error"} 2
skopeo_operations_total{operation="inspect",status="success"} 8
# HELP skopeo_operation_duration_seconds Время выполнения операций skopeo в секундах
# TYPE skopeo_operation_duration_seconds histogram
skopeo_operation_duration_seconds_bucket{operation="copy",le="0.1"} 0
skopeo_operation_duration_seconds_bucket{operation="copy",le="0.5"} 2
skopeo_operation_duration_seconds_bucket{operation="copy",le="1.0"} 8
skopeo_operation_duration_seconds_bucket{operation="copy",le="+Inf"} 15
skopeo_operation_duration_seconds_sum{operation="copy"} 12.5
skopeo_operation_duration_seconds_count{operation="copy"} 15
Метрики blob'ов
# HELP skopeo_blobs_processed_total Общее количество обработанных blob'ов
# TYPE skopeo_blobs_processed_total counter
skopeo_blobs_processed_total{operation="copy",status="success"} 45
skopeo_blobs_processed_total{operation="copy",status="error"} 3
# HELP skopeo_blob_size_bytes Размер blob'ов в байтах
# TYPE skopeo_blob_size_bytes histogram
skopeo_blob_size_bytes_bucket{operation="copy",le="1024"} 5
skopeo_blob_size_bytes_bucket{operation="copy",le="10240"} 12
skopeo_blob_size_bytes_bucket{operation="copy",le="1048576"} 28
skopeo_blob_size_bytes_bucket{operation="copy",le="+Inf"} 45
skopeo_blob_size_bytes_sum{operation="copy"} 2.5e+08
skopeo_blob_size_bytes_count{operation="copy"} 45
Активные операции
# HELP skopeo_active_operations Количество активных операций skopeo
# TYPE skopeo_active_operations gauge
skopeo_active_operations{operation="copy"} 2
skopeo_active_operations{operation="inspect"} 0
Мониторинг и визуализация
Grafana дашборды
В проекте включен готовый дашборд Grafana для визуализации метрик skopeo-wrapper:
# Импорт дашборда в Grafana
# Файл: examples/grafana_dashboard.json
Дашборд включает:
- Общую статистику операций
- Время выполнения операций
- Количество обработанных blob'ов
- Размеры blob'ов
- Активные операции
- Типы источников и назначений
- Алерты и ошибки
Интеграция с приложениями
Для экспорта метрик в приложении, использующем skopeo-wrapper:
from skopeo_wrapper import SkopeoWrapper
from prometheus_client import start_http_server, generate_latest
# Создание обертки с метриками
skopeo = SkopeoWrapper(enable_metrics=True)
# Запуск HTTP сервера для экспорта метрик
start_http_server(8000)
# Получение метрик
metrics = skopeo.get_metrics()
print(metrics)
Prometheus конфигурация
Пример конфигурации Prometheus для сбора метрик:
# Файл: examples/prometheus.yml
scrape_configs:
- job_name: 'skopeo-wrapper-app'
static_configs:
- targets: ['your-app:8000'] # Адрес вашего приложения
scrape_interval: 5s
metrics_path: /metrics
Алертинг
Настроенные правила алертинга для мониторинга:
# Файл: examples/skopeo-wrapper-alerts.yml
- alert: SkopeoHighErrorRate
expr: rate(skopeo_operation_errors_total[5m]) > 0.1
for: 2m
labels:
severity: warning
Тестирование
Базовые тесты
python -m pytest tests/
Тесты метрик
python -m pytest tests/test_metrics.py -v
Тесты для skopeo 1.18
python tests/test_skopeo_118.py
Примеры использования
python examples/basic_usage.py
python examples/advanced_usage.py
python examples/metrics_usage.py
Тесты включают:
- Копирование образов с различными типами прогресса
- Инспекцию образов
- Обработку ошибок
- Специальные тесты для skopeo 1.18
- Полное покрытие метрик Prometheus
Ограничения
- Skopeo не предоставляет детальную информацию о прогрессе загрузки blob'ов
- Прогресс рассчитывается приблизительно на основе этапов операции
- Размер blob'ов не всегда доступен в выводе skopeo
- В skopeo 1.18 отсутствует этап "Storing signatures"
- Парсинг прогресса основан на анализе stderr, что может быть нестабильным
Разработка
Установка в режиме разработки
git clone https://github.com/your-username/skopeo-wrapper.git
cd skopeo-wrapper
pip install -e ".[dev]"
Запуск тестов
pytest tests/ -v
Форматирование кода
black skopeo_wrapper/ tests/ examples/
flake8 skopeo_wrapper/ tests/ examples/
Лицензия
MIT License
Вклад в проект
Приветствуются pull request'ы и issue'ы для улучшения библиотеки.
Changelog
1.0.0
- Первоначальный релиз
- Поддержка skopeo 1.18
- CLI интерфейс
- Парсинг прогресса операций
- Полная документация
Test commit after tag
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skopeo_wrapper-0.0.0.tar.gz.
File metadata
- Download URL: skopeo_wrapper-0.0.0.tar.gz
- Upload date:
- Size: 33.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd2b8321e7ad6dc80a9b581dd6c13b3b1b573d06a2022459e5e2b90abc7c4634
|
|
| MD5 |
c04a924a308b1a1e22619721cd5e802c
|
|
| BLAKE2b-256 |
a63f686727d06af6d9e8ba9f038dba28dfeb1dbe3f5a87892b7c94e568a87a24
|
Provenance
The following attestation bundles were made for skopeo_wrapper-0.0.0.tar.gz:
Publisher:
publish.yml on vpuhoff/skopeo-wrapper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skopeo_wrapper-0.0.0.tar.gz -
Subject digest:
dd2b8321e7ad6dc80a9b581dd6c13b3b1b573d06a2022459e5e2b90abc7c4634 - Sigstore transparency entry: 648704713
- Sigstore integration time:
-
Permalink:
vpuhoff/skopeo-wrapper@c032be7294eee046c688b131944378c71f48812b -
Branch / Tag:
refs/tags/1.0.1 - Owner: https://github.com/vpuhoff
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c032be7294eee046c688b131944378c71f48812b -
Trigger Event:
release
-
Statement type:
File details
Details for the file skopeo_wrapper-0.0.0-py3-none-any.whl.
File metadata
- Download URL: skopeo_wrapper-0.0.0-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5fbb975a234590519ba506680018ab589ea117785cfbe71da08ba7cd62263e9
|
|
| MD5 |
17a6241070e8e99a0d9a8d2b4dd5ed64
|
|
| BLAKE2b-256 |
8c4edb6ce1bcd2c43868cff1e1b07414c5bc0f4a8522dfc625e6dd11035b9543
|
Provenance
The following attestation bundles were made for skopeo_wrapper-0.0.0-py3-none-any.whl:
Publisher:
publish.yml on vpuhoff/skopeo-wrapper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skopeo_wrapper-0.0.0-py3-none-any.whl -
Subject digest:
f5fbb975a234590519ba506680018ab589ea117785cfbe71da08ba7cd62263e9 - Sigstore transparency entry: 648704718
- Sigstore integration time:
-
Permalink:
vpuhoff/skopeo-wrapper@c032be7294eee046c688b131944378c71f48812b -
Branch / Tag:
refs/tags/1.0.1 - Owner: https://github.com/vpuhoff
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c032be7294eee046c688b131944378c71f48812b -
Trigger Event:
release
-
Statement type: