
OCI2Git
[//]: # (макет для будущего test.yaml) [//]: # ([](https://github.com/Virviil/oci2git/actions))
Приложение на Rust, которое преобразует образы контейнеров (Docker и др.) в Git-репозитории и генерирует спецификацию файловой системы (fsbom) в YAML. Каждый слой контейнера представлен как коммит в Git, сохраняя историю и структуру исходного образа.

Возможности
- Анализировать Docker-образы и извлекать информацию о слоях
- Создавать Git-репозиторий, где каждый слой образа представлен отдельным коммитом
- Генерировать YAML-спецификацию файловой системы (fsbom) с перечнем файлов по слоям
- Поддержка пустых слоев (ENV, WORKDIR и др.) как пустых коммитов
- Полное извлечение метаданных в формате Markdown
- Расширяемая архитектура для поддержки различных контейнерных движков
Сценарии использования
Сравнение слоев
При устранении неполадок контейнеров можно использовать мощные инструменты сравнения Git для точного выявления изменений между любыми двумя слоями. Выполняяgit diff между коммитами, инженеры видят, какие файлы были добавлены, изменены или удалены, что значительно облегчает понимание воздействия каждой инструкции Dockerfile и поиск проблемных изменений.

Отслеживание происхождения
Используяgit blame, разработчики могут быстро определить, какой слой добавил конкретный файл или строку кода. Это особенно важно при диагностике проблем с конфигурационными файлами или зависимостями. Вместо ручной проверки каждого слоя можно сразу проследить происхождение любого файла до исходного слоя и соответствующей инструкции Dockerfile.Отслеживание жизненного цикла файлов
OCI2Git позволяет отслеживать путь конкретного файла на протяжении всей истории образа контейнера. Можно наблюдать момент создания файла, как он изменялся на разных слоях и когда был удалён. Такой комплексный обзор помогает понять эволюцию файлов без необходимости вручную отслеживать изменения через десятки слоев.Чтобы отслеживать историю файла в вашем контейнерном образе — когда он впервые появился, изменялся или был удалён — после конвертации используйте эти команды Git:
# Full history of a file (including renames)
git log --follow -- /rootfs/my/file/pathFirst appearance (i.e. creation) - see which layer introduced the file
git log --diff-filter=A -- /rootfs/my/file/pathAll changes made to the file (with diffs)
git log -p --follow -- /rootfs/my/file/pathWhen the file was deleted
git log --diff-filter=D -- /rootfs/my/file/pathShow 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 alpConvert second image to the same output folder
oci2git nginx:1.28.0-alpine-slim -o alpOCI2Git автоматически обнаруживает общие слои между образами и создает ветвящуюся структуру, отражающую их общий базис. История Git будет показывать:
- Общий ствол, содержащий все общие слои
- Отдельные ветки, которые расходятся только там, где образы действительно различаются
- Четкую визуализацию того, где образы имеют общих предков и где они становятся уникальными
- Умное управление дубликатами: если один и тот же образ обрабатывается дважды, алгоритм обнаруживает это до финального коммита метаданных и пропускает создание дублирующей ветки
- Анализа семейства образов: Понимания того, как различные варианты образа (версии, архитектуры или конфигурации) связаны друг с другом
- Влияния базового образа: Возможности увидеть, как изменения базового образа влияют на множество производных образов
- Возможностей для оптимизации: Выявления общих компонентов, которые можно более эффективно использовать в разных вариантах образов

Дополнительные сценарии использования
- Аудит безопасности: Определение точного момента, когда были внедрены уязвимые пакеты или конфигурации, и отслеживание их до конкретных инструкций сборки.
- Оптимизация образов: Анализ структуры слоев для поиска избыточных операций или крупных файлов, которые можно объединить, чтобы уменьшить размер образа.
- Управление зависимостями: Отслеживание, когда зависимости были добавлены, обновлены или удалены в истории образа.
- Улучшение процесса сборки: Изучение состава слоев для оптимизации инструкций Dockerfile с целью лучшего кеширования и уменьшения размера образа.
- Сравнение образов: Конвертация нескольких связанных образов в репозитории Git и использование инструментов сравнения Git для анализа их различий и общих черт.
Установка
Менеджеры пакетов
#### macOS / Linux (Homebrew)
brew tap virviil/oci2git
brew install oci2git#### Debian / Ubuntu
Скачайте и установите пакет .deb из последнего релиза:
# For amd64 (x86_64)
wget https://github.com/virviil/oci2git/releases/latest/download/oci2git_VERSION_amd64.deb
sudo dpkg -i oci2git_VERSION_amd64.debFor arm64
wget https://github.com/virviil/oci2git/releases/latest/download/oci2git_VERSION_arm64.deb
sudo dpkg -i oci2git_VERSION_arm64.deb#### Arch Linux (AUR)
# Using yay
yay -S oci2git-binUsing paru
paru -S oci2git-binManual installation
git clone https://aur.archlinux.org/oci2git-bin.git
cd oci2git-bin
makepkg -siПредварительно собранные бинарные файлы
Скачайте подходящий бинарный файл для вашей платформы из последнего релиза:
# Linux x86_64
wget https://github.com/virviil/oci2git/releases/latest/download/oci2git-linux-x86_64.tar.gz
tar xzf oci2git-linux-x86_64.tar.gz
sudo mv oci2git-linux-x86_64 /usr/local/bin/oci2git
chmod +x /usr/local/bin/oci2gitmacOS (Apple Silicon)
wget https://github.com/virviil/oci2git/releases/latest/download/oci2git-darwin-aarch64.tar.gz
tar xzf oci2git-darwin-aarch64.tar.gz
sudo mv oci2git-darwin-aarch64 /usr/local/bin/oci2git
chmod +x /usr/local/bin/oci2gitС Crates.io
cargo install oci2gitИз источника
# Clone the repository
git clone https://github.com/virviil/oci2git.git
cd oci2gitInstall locally
cargo install --path .Использование
oci2git [OPTIONS]
oci2git convert [OPTIONS]
oci2git fsbom [OPTIONS] convert — OCI-образ → Git-репозиторий
oci2git convert [OPTIONS]
or simply:
oci2git Параметры:
-o, --output Каталог вывода для репозитория Git [по умолчанию: ./container_repo]
-e, --engine Контейнерный движок для использования (docker, nerdctl, tar) [по умолчанию: docker]
-v, --verbose Подробный режим (-v для информации, -vv для отладки, -vvv для трассировки)
fsbom — Спецификация состава файловой системы
oci2git fsbom [OPTIONS] Опции:
-o, --output Путь вывода для файла YAML BOM [по умолчанию: ./fsbom.yml]
-e, --engine Используемый контейнерный движок (docker, nerdctl, tar) [по умолчанию: docker]
-v, --verbose Подробный режим (-v для info, -vv для debug, -vvv для trace)
Переменные среды:
TMPDIR Установите эту переменную среды для изменения стандартного расположения, используемого для промежуточной обработки данных. Зависит от платформы (например, TMPDIR на Unix/macOS, TEMP или TMP на Windows).
Примеры
Конвертация
Использование движка Docker (по умолчанию):
oci2git ubuntu:latest
or explicitly:
oci2git convert ubuntu:latest -o ./ubuntu-repo
Использование уже загруженного tarball-образа:oci2git convert -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:latestConvert the tarball to a Git repository
oci2git convert -e tar -o ./ubuntu-repo ubuntu-latest.tarЭто создаст репозиторий Git в ./ubuntu-repo, содержащий:
Image.md— Полные метаданные об образе в формате Markdownrootfs/— Содержимое файловой системы из контейнера
- Первый коммит содержит только файл
Image.mdс полной метаинформацией - Каждый последующий коммит соответствует одному слою из исходного образа
- Коммиты включают команду Dockerfile в качестве сообщения коммита
Ведомость файловой системы (fsbom)
Генерируйте YAML, перечисляющий каждый файл, добавленный или изменённый в каждом слое:
oci2git fsbom ubuntu:latest -o ubuntu.yml
Использование tarball:oci2git fsbom -e tar image.tar -o image-bom.ymlВыходной YAML перечисляет каждый слой с его элементами, отмеченными по типу (file, hardlink, symlink, directory) и статусу (n:uid:gid для новых, m:uid:gid для изменённых). Удалённые файлы (OCI whiteouts) исключены.
layers:
- index: 0
command: "ADD rootfs.tar.gz / # buildkit"
digest: "sha256:45f3ea58..."
entries:
- type: file
path: "bin/busybox"
size: 919304
mode: 493
stat: "n:0:0"
- type: hardlink
path: "bin/sh"
target: "bin/busybox"
stat: "n:0:0"
- type: symlink
path: "lib64"
target: "lib"
stat: "n:0:0"
- index: 1
command: "RUN apk add --no-cache curl"
digest: "sha256:..."
entries:
- type: file
path: "usr/bin/curl"
size: 204800
mode: 493
stat: "n:0:0"
- type: file
path: "etc/apk/world"
size: 32
mode: 420
stat: "m:0:0"Структура репозитория
repository/
├── .git/
├── Image.md # Complete image metadata
└── rootfs/ # Filesystem content from the container
Требования
- Rust редакция 2021
- Docker CLI (для поддержки Docker engine)
- Git
Лицензия
MIT
[документация]: https://docs.rs/oci2git/
--- Tranlated By Open Ai Tx | Last indexed: 2026-04-02 ---