Web Analytics

oci2git

⭐ 401 stars Thai by Virviil

🌐 ภาษา

OCI2Git

[Documentation][documentation] Crates.io License ดาวน์โหลด

[//]: # (mock สำหรับ 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 repository และสร้างไฟล์ bill of materials ของไฟล์ระบบ (fsbom) ในรูปแบบ YAML โดยแต่ละเลเยอร์ของคอนเทนเนอร์จะถูกแทนด้วย Git commit เพื่อรักษาประวัติและโครงสร้างของอิมเมจต้นฉบับ

เดโม OCI2Git ที่แปลงอิมเมจ nginx

คุณสมบัติ

กรณีใช้งาน

เปรียบเทียบเลเยอร์ (Layer Diffing)

เมื่อทำการแก้ไขปัญหาของคอนเทนเนอร์ คุณสามารถใช้ความสามารถ diff อันทรงพลังของ Git เพื่อตรวจสอบอย่างแม่นยำว่ามีอะไรเปลี่ยนแปลงระหว่างสองเลเยอร์ การใช้ git diff ระหว่าง commit วิศวกรจะเห็นได้ชัดเจนว่าไฟล์ใดถูกเพิ่ม แก้ไข หรือลบออก ทำให้เข้าใจผลกระทบของแต่ละคำสั่งใน Dockerfile และหาตำแหน่งของการเปลี่ยนแปลงที่มีปัญหาได้ง่ายขึ้น ตัวอย่างการเปรียบเทียบเลเยอร์

การติดตามต้นกำเนิด (Origin Tracking)

โดยใช้ git blame นักพัฒนาสามารถตรวจสอบได้อย่างรวดเร็วว่าเลเยอร์ใดสร้างไฟล์หรือโค้ดบรรทัดใดขึ้นมา โดยเฉพาะอย่างยิ่งเมื่อแก้ไขปัญหาไฟล์คอนฟิกหรือ dependencies แทนที่จะต้องตรวจสอบแต่ละเลเยอร์ด้วยตนเอง คุณสามารถติดตามต้นกำเนิดของไฟล์ใด ๆ กลับไปยังเลเยอร์ต้นทางและ 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 เพื่อไปยังคอมมิตเฉพาะ คุณสามารถตรวจสอบระบบไฟล์ของคอนเทนเนอร์ได้อย่างแม่นยำตามที่มีอยู่ในชั้นนั้น สิ่งนี้ช่วยให้นักพัฒนาสามารถตรวจสอบสถานะที่แน่นอนของไฟล์และไดเรกทอรีในแต่ละช่วงของกระบวนการสร้างอิมเมจ ซึ่งให้บริบทที่สำคัญยิ่งเมื่อดีบักหรือศึกษาพฤติกรรมของคอนเทนเนอร์ 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 history จะแสดงดังนี้: แนวทางนี้มีประโยชน์อย่างยิ่งสำหรับ: โครงสร้างคลังหลายอิมเมจแสดงฐานร่วมและกิ่งที่แยกออกจากกัน

กรณีการใช้งานเพิ่มเติม

การติดตั้ง

ตัวจัดการแพ็คเกจ

#### macOS / Linux (Homebrew)

brew tap virviil/oci2git
brew install oci2git

#### เดเบียน / อูบุนตู

ดาวน์โหลดและติดตั้งแพ็กเกจ .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 สำหรับ info, -vv สำหรับ debug, -vvv สำหรับ trace)

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 engine (ค่าเริ่มต้น):

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