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

คุณสมบัติ
- วิเคราะห์อิมเมจ Docker และดึงข้อมูลเลเยอร์ออกมา
- สร้างคลัง Git ที่แต่ละเลเยอร์ของอิมเมจเป็น commit
- รองรับเลเยอร์ว่าง (เช่น ENV, WORKDIR ฯลฯ) เป็น commit ว่าง
- ดึงข้อมูลเมตาดาต้าออกมาเป็นรูปแบบ Markdown ได้อย่างสมบูรณ์
- สถาปัตยกรรมที่สามารถขยายได้เพื่อรองรับเอนจินคอนเทนเนอร์ต่างๆ
กรณีการใช้งาน
เปรียบเทียบเลเยอร์ (Layer Diffing)
เมื่อแก้ไขปัญหาคอนเทนเนอร์ คุณสามารถใช้ความสามารถ diff ของ Git เพื่อดูว่าอะไรเปลี่ยนแปลงระหว่างเลเยอร์ได้อย่างแม่นยำ โดยการรันgit diff ระหว่าง commit วิศวกรจะเห็นได้ชัดเจนว่าไฟล์ใดถูกเพิ่ม แก้ไข หรือลบออก ช่วยให้เข้าใจผลกระทบของคำสั่ง Dockerfile แต่ละบรรทัดและหาต้นตอของปัญหาได้ง่ายขึ้น

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

กรณีใช้งานเพิ่มเติม
- การตรวจสอบด้านความปลอดภัย: ระบุได้ทันทีว่าแพ็กเกจหรือการตั้งค่าที่มีช่องโหว่ถูกเพิ่มเข้ามาเมื่อไร และย้อนกลับไปยังคำสั่ง build ที่เฉพาะเจาะจงได้
- การปรับแต่งอิมเมจ: วิเคราะห์โครงสร้างเลเยอร์เพื่อค้นหากระบวนการที่ซ้ำซ้อนหรือไฟล์ขนาดใหญ่ที่สามารถรวบรวมเพื่อลดขนาดอิมเมจได้
- การจัดการ Dependencies: ติดตามว่า dependency ถูกเพิ่ม อัปเกรด หรือถูกลบออกเมื่อใดในประวัติอิมเมจ
- การปรับปรุงกระบวนการ build: ตรวจสอบองค์ประกอบของแต่ละเลเยอร์เพื่อปรับแต่งคำสั่ง Dockerfile ให้ cache ได้ดีขึ้นและลดขนาดอิมเมจ
- การเปรียบเทียบข้ามอิมเมจ: แปลงอิมเมจที่เกี่ยวข้องกันหลายตัวเป็นรีโพซิทอรี Git และใช้เครื่องมือเปรียบเทียบของ Git วิเคราะห์ความแตกต่างและส่วนที่เหมือนกัน
การติดตั้ง
ติดตั้งจากซอร์ส
# Clone the repository
git clone https://github.com/virviil/oci2git.git
cd oci2gitInstall locally
cargo install --path .จาก Crates.io
cargo install oci2gitการใช้งาน
oci2git [OPTIONS]
อาร์กิวเมนต์:
ชื่ออิมเมจที่จะทำการแปลง (เช่น 'ubuntu:latest') หรือเส้นทางไปยังไฟล์ tar เมื่อต้องการใช้ tar engineตัวเลือก:
-o, --output ไดเรกทอรีสำหรับผลลัพธ์เป็น Git repository [ค่าเริ่มต้น: ./container_repo]
-e, --engine คอนเทนเนอร์เอนจินที่จะใช้ (docker, nerdctl, tar) [ค่าเริ่มต้น: docker]
-h, --help แสดงข้อมูลช่วยเหลือ
-V, --version แสดงข้อมูลเวอร์ชัน
ตัวแปรสภาพแวดล้อม:
TMPDIR กำหนดตัวแปรสภาพแวดล้อมนี้เพื่อเปลี่ยนตำแหน่งเริ่มต้นที่ใช้สำหรับการประมวลผลข้อมูลชั่วคราว ซึ่งขึ้นอยู่กับแพลตฟอร์ม (เช่น TMPDIR บน Unix/macOS, TEMP หรือ TMP บน Windows)
ตัวอย่าง
การใช้งาน Docker engine (ค่าเริ่มต้น):
oci2git -o ./ubuntu-repo ubuntu:latestการใช้ไฟล์อิมเมจ tarball ที่ดาวน์โหลดมาแล้ว:
oci2git -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 -e tar -o ./ubuntu-repo ubuntu-latest.tarสิ่งนี้จะสร้าง Git repository ใน ./ubuntu-repo ที่ประกอบด้วย:
Image.md- ข้อมูลเมตาทั้งหมดเกี่ยวกับอิมเมจในรูปแบบ Markdownrootfs/- เนื้อหาของไฟล์ระบบจากคอนเทนเนอร์
- คอมมิตแรกประกอบด้วยไฟล์
Image.mdเท่านั้นพร้อมข้อมูลเมตาเต็มรูปแบบ - คอมมิตถัดไปแต่ละอันจะแสดงถึงเลเยอร์จากอิมเมจต้นฉบับ
- คอมมิตจะมีคำสั่ง Dockerfile เป็นข้อความคอมมิต
โครงสร้างของรีโพสิตอรี
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: 2025-12-12 ---