ฉันต้องการดึงไฟล์จากอิมเมจ Docker โดยไม่ต้องเรียกใช้อิมเมจ
docker save
ตัวเลือกไม่ currrently ตัวเลือกที่ทำงานสำหรับฉันที่มันประหยัดมากเกินไปของไฟล์เพียงเพื่อยกเลิกการ tar ไฟล์ที่เฉพาะเจาะจง
ฉันต้องการดึงไฟล์จากอิมเมจ Docker โดยไม่ต้องเรียกใช้อิมเมจ
docker save
ตัวเลือกไม่ currrently ตัวเลือกที่ทำงานสำหรับฉันที่มันประหยัดมากเกินไปของไฟล์เพียงเพื่อยกเลิกการ tar ไฟล์ที่เฉพาะเจาะจง
คำตอบ:
คุณสามารถแยกไฟล์จากภาพด้วยคำสั่งต่อไปนี้:
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
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
ไม่มีข้อใดถูกเลยสำหรับฉัน คำสั่งการทำงานที่สมบูรณ์คือ:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
ไม่มีเครื่องหมายคำพูดcat
ถูกส่งผ่านโดยไม่มีชื่อไฟล์ดังนั้นจึงไม่ทราบว่าจะแสดงอะไร นอกจากนี้ควรลบคอนเทนเนอร์หลังจากคำสั่งเสร็จสิ้น
หากฉันไม่เข้าใจผิดฉันเชื่อว่าคอนเทนเนอร์นักเทียบท่าจะเก็บไฟล์แคชที่สร้างในไดเรกทอรีต่อไปนี้สำหรับ Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
จากตรงนั้นคุณควรจะสามารถเข้าถึงระบบไฟล์และเรียกคืนไฟล์ของคุณได้
layersize
และjson
และยังไม่สามารถอ่านได้โดยผู้ใช้ (แม้ว่าผู้ใช้จะอยู่ในกลุ่มนักเทียบท่า) /var/lib/docker/aufs/diff
จะมีไฟล์ที่ฉันค้นหา (แต่ถูกจัดหมวดหมู่ไม่ใช่ตามรหัสคอนเทนเนอร์) และยังไม่สามารถอ่านได้
/var/lib/docker/aufs
(แต่ไม่ใช่ไดเรกทอรีอื่นทั้งหมดใน/var/lib/docker/
)
หากการจัดเก็บเอาต์พุตเต็มของ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 สำหรับแต่ละไฟล์จนกว่าคุณจะเจอไฟล์ที่ถูกต้อง
แทนที่ข้อความเป็นตัวพิมพ์ใหญ่ในคำสั่งด้านบนด้วยชื่อภาพเช็คซัมและชื่อไฟล์ที่ถูกต้องสำหรับเคสของคุณ