
OCI2Git
[//]: # (mock สำหรับ test.yaml ในอนาคต) [//]: # ([](https://github.com/Virviil/oci2git/actions))
แอปพลิเคชัน Rust ที่ใช้แปลงอิมเมจคอนเทนเนอร์ (Docker ฯลฯ) เป็น Git repository และสร้างไฟล์ bill of materials ของไฟล์ระบบ (fsbom) ในรูปแบบ YAML โดยแต่ละเลเยอร์ของคอนเทนเนอร์จะถูกแทนด้วย Git commit เพื่อรักษาประวัติและโครงสร้างของอิมเมจต้นฉบับ

คุณสมบัติ
- วิเคราะห์อิมเมจ Docker และดึงข้อมูลเลเยอร์
- สร้าง Git repository ที่แต่ละเลเยอร์ของอิมเมจแทนด้วย commit
- สร้างไฟล์ bill of materials ของไฟล์ระบบ (fsbom) ในรูปแบบ YAML พร้อมรายการไฟล์แยกแต่ละเลเยอร์
- รองรับเลเยอร์ว่าง (ENV, WORKDIR ฯลฯ) เป็น commit ว่าง
- ดึงข้อมูลเมทาดาทาครบถ้วนเป็นรูปแบบ Markdown
- สถาปัตยกรรมที่ขยายได้สำหรับรองรับ engine คอนเทนเนอร์ต่าง ๆ
กรณีใช้งาน
เปรียบเทียบเลเยอร์ (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/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
คำสั่งเหล่านี้ช่วยให้ติดตามประวัติไฟล์แบบสมบูรณ์ในแต่ละชั้นของคอนเทนเนอร์ได้อย่างง่ายดาย โดยไม่ต้องยุ่งยากกับการแยกและเปรียบเทียบ tarball ของแต่ละชั้นด้วยตนเองการวิเคราะห์หลายชั้น
บางครั้งการเปรียบเทียบที่ให้ข้อมูลเชิงลึกมากที่สุดมาจากการตรวจสอบการเปลี่ยนแปลงในหลายชั้นที่ไม่ต่อเนื่องกัน ด้วย 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 alp
OCI2Git จะตรวจจับเลเยอร์ที่ใช้ร่วมกันระหว่างอิมเมจโดยอัตโนมัติและสร้างโครงสร้างแบบกิ่งที่สะท้อนถึงฐานร่วมกัน Git history จะแสดงดังนี้:
- ทรังก์หลักที่มีเลเยอร์ที่ใช้ร่วมกันทั้งหมด
- กิ่งแยกที่จะแตกต่างกันเฉพาะเมื่ออิมเมจมีความแตกต่างกันจริง ๆ
- การแสดงภาพที่ชัดเจนว่าอิมเมจใดมีรากฐานร่วมกันหรือเมื่อใดที่แตกต่างกันโดยสิ้นเชิง
- การจัดการสำเนาอัจฉริยะ: หากพบว่าอิมเมจเดียวกันถูกประมวลผลซ้ำสองครั้ง อัลกอริทึมจะตรวจจับได้ก่อนบันทึกข้อมูลเมตาสุดท้ายและข้ามการสร้างกิ่งสำเนาใหม่
- การวิเคราะห์กลุ่มอิมเมจ: เข้าใจว่าสายพันธุ์ต่าง ๆ ของอิมเมจ (เวอร์ชัน สถาปัตยกรรม หรือการกำหนดค่าแตกต่างกัน) มีความสัมพันธ์กันอย่างไร
- ผลกระทบของอิมเมจฐาน: ดูได้อย่างชัดเจนว่าการเปลี่ยนแปลงในอิมเมจฐานส่งผลต่ออิมเมจที่ต่อยอดอย่างไรบ้าง
- โอกาสในการเพิ่มประสิทธิภาพ: ระบุส่วนประกอบที่ใช้ร่วมกันซึ่งสามารถนำมาใช้ให้เกิดประโยชน์มากขึ้นในสายพันธุ์อิมเมจต่าง ๆ

กรณีการใช้งานเพิ่มเติม
- การตรวจสอบความปลอดภัย: ระบุได้อย่างแม่นยำว่าแพ็คเกจหรือการตั้งค่าที่มีช่องโหว่ถูกเพิ่มเข้ามาเมื่อใดและย้อนกลับไปยังคำสั่ง build เฉพาะ
- การเพิ่มประสิทธิภาพอิมเมจ: วิเคราะห์โครงสร้างเลเยอร์เพื่อค้นหาการดำเนินการซ้ำซ้อนหรือไฟล์ขนาดใหญ่ที่สามารถถูกรวม เพื่อช่วยลดขนาดอิมเมจ
- การจัดการการพึ่งพา: ติดตามว่าการพึ่งพาถูกเพิ่ม อัปเกรด หรือถอดออกเมื่อใดในประวัติอิมเมจ
- การปรับปรุงกระบวนการ build: ตรวจสอบองค์ประกอบของเลเยอร์เพื่อปรับแต่ง Dockerfile ให้เหมาะสมสำหรับการแคชและขนาดอิมเมจที่เล็กลง
- การเปรียบเทียบข้ามอิมเมจ: แปลงอิมเมจที่เกี่ยวข้องหลายรายการเป็นคลัง Git แล้วใช้เครื่องมือเปรียบเทียบของ Git เพื่อวิเคราะห์ความแตกต่างและความเหมือน
การติดตั้ง
ตัวจัดการแพ็คเกจ
#### 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.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 สำหรับ 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: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 ---