Web Analytics

oci2git

⭐ 374 stars Japanese by Virviil

🌐 言語

OCI2Git

[ドキュメント][documentation] Crates.io ライセンス Downloads

[//]: # (mock for future test.yaml) [//]: # ([![Test Status](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コミットとして表現され、元のイメージの履歴と構造を維持します。

Demo of OCI2Git converting the nginx image

特長

ユースケース

レイヤーの差分比較

コンテナの問題をトラブルシュートする際、Gitの強力な差分機能を使って任意の2つのレイヤー間で何が変更されたか正確に特定できます。git diffをコミット間で実行することで、エンジニアはどのファイルが追加・変更・削除されたかを把握でき、各Dockerfile命令の影響や問題のある変更箇所を素早く特定できます。 Example for layer diff

由来追跡

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
これらのコマンドにより、レイヤーのtarballを手動で抽出・比較する複雑さなしに、任意のファイルのコンテナレイヤー全体の履歴を簡単に追跡できます。

マルチレイヤー分析

時には、連続していない複数のレイヤー間の変更を調べることが最も洞察に富んだ比較をもたらします。OCI2Gitを使えば、Gitの比較ツールを利用して複数のビルドステージにわたるコンポーネントの進化を分析し、隣接するレイヤーだけを見ていると見えないパターンを特定できます。

レイヤーの探索

git checkoutを使用して任意のコミットに移動することで、そのレイヤーの時点でのコンテナファイルシステムを正確に調べることができます。これにより、開発者はイメージ作成プロセスの任意の時点でのファイルやディレクトリの正確な状態を検査でき、デバッグやコンテナの動作検証時に非常に有用なコンテキストを提供します。 Checkout to previous commit

マルチイメージ分析

共通の起源を持つ複数のコンテナイメージを扱う場合、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 中間データ処理に使用されるデフォルトの場所を変更するためにこの環境変数を設定します。これはプラットフォーム依存です(例: Unix/macOSではTMPDIR、WindowsではTEMPまたはTMP)。

Dockerエンジン使用(デフォルト):

oci2git -o ./ubuntu-repo ubuntu:latest

すでにダウンロードされたイメージtarballを使用する場合:

oci2git -e tar -o ./ubuntu-repo /path/to/ubuntu-latest.tar
tarエンジンは有効なOCIフォーマットのtarボールを期待しており、これは通常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

これにより、./ubuntu-repo に以下を含むGitリポジトリが作成されます:

Gitの履歴はコンテナのレイヤー履歴を反映します:

リポジトリ構成

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

必要条件

ライセンス

MIT

[documentation]: https://docs.rs/oci2git/

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