Web Analytics

oci2git

⭐ 401 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-репозитории и генерирует спецификацию файловой системы (fsbom) в YAML. Каждый слой контейнера представлен как коммит в 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 будет показывать:

Этот подход особенно ценен для: Структура репозитория с несколькими образами, показывающая общий базис и расходящиеся ветви

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

Установка

Менеджеры пакетов

#### 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.deb

For 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-bin

Using paru

paru -S oci2git-bin

Manual 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/oci2git

macOS (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 oci2git

Install 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:latest

Convert the tarball to a Git repository

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

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

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

Ведомость файловой системы (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

Требования

Лицензия

MIT

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

--- Tranlated By Open Ai Tx | Last indexed: 2026-04-02 ---