Web Analytics

oci2git

⭐ 374 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 โดยแต่ละเลเยอร์ของคอนเทนเนอร์จะถูกแทนด้วย commit ใน Git เพื่อรักษาประวัติและโครงสร้างของอิมเมจต้นฉบับ

ตัวอย่างการทำงานของ OCI2Git กับอิมเมจ nginx

คุณสมบัติ

กรณีการใช้งาน

เปรียบเทียบเลเยอร์ (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/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 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:latest

Convert the tarball to a Git repository

oci2git -e tar -o ./ubuntu-repo ubuntu-latest.tar

สิ่งนี้จะสร้าง Git repository ใน ./ubuntu-repo ที่ประกอบด้วย:

ประวัติของ Git จะสะท้อนประวัติเลเยอร์ของคอนเทนเนอร์:

โครงสร้างของรีโพสิตอรี

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: 2025-12-12 ---