Web Analytics

oci2git

⭐ 374 stars Korean 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))

컨테이너 이미지(Docker 등)를 Git 저장소로 변환하는 Rust 애플리케이션입니다. 각 컨테이너 레이어는 Git 커밋으로 표현되어 원본 이미지의 히스토리와 구조를 보존합니다.

OCI2Git가 nginx 이미지를 변환하는 데모

특징

사용 사례

레이어 디프(Layer Diffing)

컨테이너 문제를 해결할 때, Git의 강력한 diff 기능을 사용하여 두 레이어 사이에 정확히 어떤 변화가 있었는지 식별할 수 있습니다. 커밋 간에 git diff를 실행하면 엔지니어는 어떤 파일이 추가, 수정, 삭제되었는지 정확히 볼 수 있어 각 Dockerfile 명령의 영향과 문제의 원인을 쉽게 파악할 수 있습니다. 레이어 디프 예시

변경 출처 추적(Origin Tracking)

git blame을 사용하면 개발자는 특정 파일이나 코드 라인이 어떤 레이어에서 도입되었는지 빠르게 확인할 수 있습니다. 이는 설정 파일이나 의존성 문제를 진단할 때 특히 유용합니다. 각 레이어를 수동으로 확인할 필요 없이 모든 파일의 출처를 즉시 해당 레이어와 Dockerfile 명령으로 추적할 수 있습니다.

파일 생애주기 추적(File Lifecycle Tracking)

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을 사용해 특정 커밋으로 이동하면 해당 레이어에 존재했던 컨테이너 파일시스템을 정확히 검사할 수 있습니다. 이를 통해 개발자는 이미지 생성 과정의 어느 시점에 파일과 디렉토리의 정확한 상태를 확인할 수 있어, 디버깅이나 컨테이너 동작 검토 시 매우 유용한 컨텍스트를 제공합니다. 이전 커밋으로 체크아웃

다중 이미지 분석

공통 조상을 가진 여러 컨테이너 이미지를 작업할 때, 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] 
Arguments: 변환할 이미지 이름 (예: 'ubuntu:latest') 또는 tar 엔진 사용 시 tarball 경로

Options: -o, --output Git 저장소의 출력 디렉토리 [기본값: ./container_repo] -e, --engine 사용할 컨테이너 엔진 (docker, nerdctl, tar) [기본값: docker] -h, --help 도움말 정보 출력 -V, --version 버전 정보 출력

Environment Variables: TMPDIR 중간 데이터 처리를 위한 기본 위치를 변경하려면 이 환경 변수를 설정하세요. 플랫폼에 따라 다릅니다(예: Unix/macOS는 TMPDIR, Windows는 TEMP 또는 TMP).

Examples

Using Docker engine (default):

oci2git -o ./ubuntu-repo ubuntu:latest

이미 다운로드된 이미지 tarball 사용:

oci2git -e tar -o ./ubuntu-repo /path/to/ubuntu-latest.tar
tar 엔진은 일반적으로 docker save로 생성된 유효한 OCI 형식의 tarball을 예상합니다:

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