แตกไฟล์จากอิมเมจ Docker หรือไม่


24

ฉันต้องการดึงไฟล์จากอิมเมจ Docker โดยไม่ต้องเรียกใช้อิมเมจ

docker saveตัวเลือกไม่ currrently ตัวเลือกที่ทำงานสำหรับฉันที่มันประหยัดมากเกินไปของไฟล์เพียงเพื่อยกเลิกการ tar ไฟล์ที่เฉพาะเจาะจง


คุณใช้ distro อะไร
ryekayo

@ryekayo: Ubuntu 14, นักเทียบท่า 1.12.4 (api 1.24)
BlakBat

คำตอบ:


21

คุณสามารถแยกไฟล์จากภาพด้วยคำสั่งต่อไปนี้:

docker create $image  # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id

ตามdocker create เอกสารนี้จะไม่เรียกใช้คอนเทนเนอร์:

docker createคำสั่งสร้างชั้นภาชนะเขียนได้มากกว่าภาพที่ระบุไว้และเตรียมความพร้อมสำหรับการเรียกใช้คำสั่งที่ระบุ STDOUTรหัสคอนเทนเนอร์ถูกพิมพ์ไปแล้ว สิ่งนี้คล้ายกับdocker run -dยกเว้นคอนเทนเนอร์ไม่เคยเริ่มต้น จากนั้นคุณสามารถใช้docker start <container_id>คำสั่งเพื่อเริ่มคอนเทนเนอร์ได้ทุกเมื่อ


สำหรับการอ้างอิง (คำตอบก่อนหน้าของฉัน) วิธีที่มีประสิทธิภาพน้อยกว่าในการแยกไฟล์จากรูปภาพมีดังต่อไปนี้:

docker run some_image cat $file_path > $output_path

3
คุณอาจต้องการข้ามจุดเข้าใช้งาน docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Andrew

1
สิ่งนี้เรียกใช้รูปภาพซึ่งเป็นสิ่งที่ฉันไม่ต้องการทำตามที่ระบุไว้ในคำถามของฉัน
BlakBat

อานั่นเป็นจุดที่ดี ฉันเห็นด้วยกับคำตอบปัจจุบันของฉันไม่เป็นที่พอใจ
bbc

1
@BlakBat คำตอบที่อัปเดตนี้ใช้ได้กับคุณหรือไม่ ฉันเดาว่าฉันควรสร้างคำตอบใหม่ แต่ตอนนี้เสร็จแล้ว
bbc

1
@bbc คำตอบที่อัพเดตนี้จริง ๆ แล้วไม่ได้เริ่มต้นคอนเทนเนอร์ (crux ของคำถาม) และไม่จำเป็นต้องเป็น root
BlakBat

2

ไม่มีข้อใดถูกเลยสำหรับฉัน คำสั่งการทำงานที่สมบูรณ์คือ:

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

ไม่มีเครื่องหมายคำพูดcatถูกส่งผ่านโดยไม่มีชื่อไฟล์ดังนั้นจึงไม่ทราบว่าจะแสดงอะไร นอกจากนี้ควรลบคอนเทนเนอร์หลังจากคำสั่งเสร็จสิ้น


คำสั่งที่คุณอ้างถึงจะใช้งานได้ขึ้นอยู่กับนักเทียบท่าและวิธีการตั้งค่า ENTRYPOINT / CMD อย่างถูกต้องใน Dockerfile; สิ่งนี้ไม่เกี่ยวกับข้อความ นอกจากนี้คุณยังบอกว่าจะลบคอนเทนเนอร์ แต่คุณระบุ --rm สุดท้ายเมื่อฉันโพสต์คำถามของฉันฉันระบุ "โดยไม่ต้องเรียกใช้ภาพ" และไม่มีคำตอบที่เป็นทางออกที่คำนึงถึงเรื่องนี้
BlakBat

1
ไม่ว่า CMD และ ENTRYPOINT ใดที่ถูกตั้งค่าใน Dockerfile I จะแทนที่ทั้งสองดังนั้นมันจะทำงานได้ตลอดเวลา (บน Linux แน่นอน) คุณหมายถึงอะไร "ขึ้นอยู่กับนักเทียบท่า" การตั้งค่าเวอร์ชัน env อะไร คำถามของคุณไม่ถูกต้องเนื่องจากไม่สามารถดำเนินการกับภาพได้เฉพาะคอนเทนเนอร์เท่านั้น ฉันคิดว่าไม่มีคำตอบที่ถูกต้องคุณต้องจัดการกับไฟล์จำนวนมากหรือสร้างที่เก็บชั่วคราว - ลบคอนเทนเนอร์ชั่วคราวคำตอบอื่น ๆ จะทิ้งขยะไว้บนดิสก์ของคุณ
sekrett

1

หากฉันไม่เข้าใจผิดฉันเชื่อว่าคอนเทนเนอร์นักเทียบท่าจะเก็บไฟล์แคชที่สร้างในไดเรกทอรีต่อไปนี้สำหรับ Ubuntu:

/var/lib/docker/aufs/diff/<container_id>

จากตรงนั้นคุณควรจะสามารถเข้าถึงระบบไฟล์และเรียกคืนไฟล์ของคุณได้


Nope ไดเรกทอรีนั้นมีเพียงlayersizeและjsonและยังไม่สามารถอ่านได้โดยผู้ใช้ (แม้ว่าผู้ใช้จะอยู่ในกลุ่มนักเทียบท่า) /var/lib/docker/aufs/diffจะมีไฟล์ที่ฉันค้นหา (แต่ถูกจัดหมวดหมู่ไม่ใช่ตามรหัสคอนเทนเนอร์) และยังไม่สามารถอ่านได้
BlakBat

ให้ฉันหน่อยแล้วฉันจะเงยหน้าขึ้นมอง ฉันรู้ความจริงมีวิธีการเรียกไฟล์โดยไม่ต้องเข้าคอนเทนเนอร์หรือใช้งานได้
ryekayo

หากไม่อ่านจะแสดงได้อย่างไร ฉันได้พบตัวอย่างที่คุณสามารถดึงไฟล์ข้อความจากคอนเทนเนอร์โดยไปที่ไดเรกทอรี / var / lib / docker / aufs / diff / *
ryekayo

ความผิดพลาดของฉัน. ผู้ใช้สามารถเข้าถึง/var/lib/docker/aufs(แต่ไม่ใช่ไดเรกทอรีอื่นทั้งหมดใน/var/lib/docker/)
BlakBat

คุณสามารถเข้าถึงในฐานะรูทได้หรือไม่?
ryekayo

0

หากการจัดเก็บเอาต์พุตเต็มของdocker saveไม่ใช่ตัวเลือกคุณสามารถใช้ไพพ์ไลน์เพื่อแยกเฉพาะไฟล์ที่ต้องการจากมัน

น่าเสียดายเนื่องจากเอาต์พุตเป็น "tar of tars" อาจเป็นกระบวนการที่ทำซ้ำเล็กน้อย

สิ่งที่ฉันทำเมื่อฉันต้องการแตกไฟล์ตอนนี้คือ:

1) กำหนดเวอร์ชันของรูปภาพที่คุณสนใจที่จะเปลี่ยนไฟล์ล่าสุด (วิธีที่คุณทำอาจขึ้นอยู่กับรูปภาพของคุณ) และวันที่ที่สร้าง / บันทึก

2) รับสารบัญเต็มจากผลลัพธ์ของdocker saveคำสั่งด้วย:

docker save IMAGE_NAME | tar -tvf -

3) ปรับlayer.tarไฟล์ในเอาต์พุตของคำสั่งนั้นที่ตรงกับวันที่ของรูปภาพที่คุณกำหนดในขั้นตอนที่ 1 (คุณสามารถเพิ่ม| grep layer.tarเพื่อแสดงไฟล์เหล่านั้นได้)

4) แตกlayer.tarไฟล์นั้นออกเป็นมาตรฐานและรับสารบัญ:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -

5) ตรวจสอบไฟล์ที่คุณต้องการอยู่ในรายการและแตกไฟล์เมื่อคุณพบชื่อ:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE

หากมีมากกว่าหนึ่งlayer.tarไฟล์ที่ตรงกับวันที่คุณต้องการในขั้นตอนที่ 2/3 คุณอาจต้องทำซ้ำขั้นตอนที่ 4 สำหรับแต่ละไฟล์จนกว่าคุณจะเจอไฟล์ที่ถูกต้อง

แทนที่ข้อความเป็นตัวพิมพ์ใหญ่ในคำสั่งด้านบนด้วยชื่อภาพเช็คซัมและชื่อไฟล์ที่ถูกต้องสำหรับเคสของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.