Web Analytics

oci2git

⭐ 374 stars Russian by Virviil

🌐 Язык

OCI2Git

[Документация][documentation] Crates.io Лицензия Загрузки

[//]: # (макет для будущего test.yaml) [//]: # ([![Статус теста](https://img.shields.io/github/actions/workflow/status/Virviil/oci2git/rust.yml?branch=master&event=push&label=Test)](https://github.com/Virviil/oci2git/actions))

Rust-приложение, которое конвертирует образы контейнеров (Docker и др.) в Git-репозитории. Каждый слой контейнера отображается как коммит в Git, сохраняя историю и структуру исходного образа.

Демонстрация OCI2Git на примере конвертации образа nginx

Возможности

Сценарии использования

Сравнение слоев

Для устранения проблем в контейнерах можно использовать мощные возможности сравнения Git для точного выявления изменений между любыми двумя слоями. С помощью git diff между коммитами инженеры могут увидеть, какие файлы были добавлены, изменены или удалены, что упрощает понимание влияния каждой инструкции Dockerfile и поиск проблемных изменений. Пример сравнения слоев

Отслеживание происхождения

Используя git blame, разработчики могут быстро определить, какой слой добавил конкретный файл или строку кода. Это особенно ценно при диагностике проблем с конфигурационными файлами или зависимостями. Вместо ручной проверки каждого слоя можно сразу отследить источник любого файла до его исходного слоя и соответствующей инструкции Dockerfile.

Отслеживание жизненного цикла файлов

OCI2Git позволяет проследить путь конкретного файла на протяжении всей истории образа контейнера. Вы можете увидеть, когда файл был создан, как он изменялся между слоями и был ли когда-либо удалён. Такой подробный обзор помогает понять эволюцию файла без необходимости вручную отслеживать изменения через десятки слоев.

Чтобы отследить историю файла в вашем образе контейнера — включая моменты его появления, изменения или удаления — после конвертации используйте следующие команды Git:

# Full history of a file (including renames)
git log --follow -- /rootfs/my/file/path

First appearance (i.e. creation) - see which layer introduced the file

git log --diff-filter=A -- /rootfs/my/file/path

All changes made to the file (with diffs)

git log -p --follow -- /rootfs/my/file/path

When the file was deleted

git log --diff-filter=D -- /rootfs/my/file/path

Show short commit info (concise layer history)

git log --follow --oneline -- /rootfs/my/file/path
Эти команды позволяют легко проследить полную историю любого файла по слоям контейнера без необходимости вручную извлекать и сравнивать архивы слоёв.

Многоуровневый анализ

Иногда самые ценные сравнения получаются при изучении изменений между несколькими неконкретными слоями. С OCI2Git вы можете использовать инструменты сравнения Git для анализа эволюции компонентов на различных этапах сборки, выявляя закономерности, которые могут быть незаметны при анализе только соседних слоёв.

Исследование слоёв

Используя команду git checkout для перехода к определённому коммиту, вы можете изучить файловую систему контейнера в точности такой, какой она была на этом слое. Это позволяет разработчикам исследовать точное состояние файлов и каталогов на любом этапе создания образа, предоставляя ценный контекст для отладки или анализа поведения контейнера. Переход к предыдущему коммиту

Анализ нескольких образов

При работе с несколькими контейнерными образами, имеющими общий предок, OCI2Git интеллектуально создаёт ветки только в случае реального расхождения образов. Это позволяет анализировать несколько связанных образов в одном репозитории, сохраняя их общую историю.

# Convert first image to create the base repository
oci2git postgres:16.9-alpine3.21 -o alp

Convert second image to the same output folder

oci2git nginx:1.28.0-alpine-slim -o alp
OCI2Git автоматически обнаруживает общие слои между образами и создает разветвленную структуру, отражающую их общий базовый слой. История Git будет показывать: Этот подход особенно полезен для: Структура репозитория с несколькими образами, показывающая общий базовый слой и расходящиеся ветви

Дополнительные сценарии использования

Установка

Из исходников

# Clone the repository
git clone https://github.com/virviil/oci2git.git
cd oci2git

Install locally

cargo install --path .

С Crates.io

cargo install oci2git

Использование

oci2git [OPTIONS] 

Аргументы: Имя образа для конвертации (например, 'ubuntu:latest') или путь к tar-архиву при использовании tar-движка

Опции: -o, --output Каталог для вывода Git-репозитория [по умолчанию: ./container_repo] -e, --engine Движок контейнера для использования (docker, nerdctl, tar) [по умолчанию: docker] -h, --help Вывести справочную информацию -V, --version Вывести информацию о версии

Переменные окружения: TMPDIR Установите эту переменную окружения для изменения стандартного расположения, используемого для промежуточной обработки данных. Это зависит от платформы (например, TMPDIR на Unix/macOS, TEMP или TMP на Windows).

Примеры

Использование Docker-движка (по умолчанию):

oci2git -o ./ubuntu-repo ubuntu:latest
Использование уже загруженного tarball-образа:

oci2git -e tar -o ./ubuntu-repo /path/to/ubuntu-latest.tar

Движок tar ожидает действительный tarball в формате OCI, который обычно создается с помощью docker save:

# Create a tarball from a local Docker image
docker save -o ubuntu-latest.tar ubuntu:latest

Convert the tarball to a Git repository

oci2git -e tar -o ./ubuntu-repo ubuntu-latest.tar

Это создаст репозиторий Git в ./ubuntu-repo, содержащий:

История Git отражает историю слоев контейнера:

Структура репозитория

repository/
├── .git/
├── Image.md     # Complete image metadata
└── rootfs/      # Filesystem content from the container

Требования

Лицензия

MIT

[документация]: https://docs.rs/oci2git/

--- Tranlated By Open Ai Tx | Last indexed: 2025-12-12 ---