เมานต์คอนเทนเนอร์เนื้อหา Docker ในระบบไฟล์โฮสต์


24

ฉันต้องการตรวจสอบเนื้อหาของ Docker container (อ่านอย่างเดียว) วิธีที่ยอดเยี่ยมในการทำเช่นนี้คือการติดตั้งเนื้อหาของคอนเทนเนอร์ในไดเรกทอรี ฉันกำลังพูดถึงการติดตั้งเนื้อหาของคอนเทนเนอร์บนโฮสต์ไม่ใช่เกี่ยวกับการติดตั้งโฟลเดอร์บนโฮสต์ภายในคอนเทนเนอร์

ฉันเห็นได้ว่ามีไดรเวอร์เก็บข้อมูลสองตัวใน Docker ในขณะนี้: aufs และ btrfs การติดตั้ง Docker ของฉันใช้ btrfs และการเรียกดู / var / lib / docker / btrfs / subvolumes แสดงไดเรกทอรีหนึ่งไดเรกทอรีต่อคอนเทนเนอร์ Docker บนระบบ อย่างไรก็ตามนี่เป็นรายละเอียดการใช้งานของ Docker และรู้สึกผิดที่จะเมานต์ - ผูกไดเร็กทอรีเหล่านี้ที่อื่น

มีวิธีที่เหมาะสมในการทำเช่นนี้หรือฉันจะต้องแก้ไข Docker เพื่อรองรับการติดตั้งแบบนี้หรือไม่?


ทำไมการผูกภูเขาเหล่านี้ไว้ที่อื่นจึงเป็นเรื่องผิด
Michael Hampton

1
เพราะสถานที่จัดเก็บเป็นรายละเอียดการใช้งาน นักเทียบท่ารายวันจะเพิ่มโปรแกรมควบคุมที่เก็บข้อมูลอีกตำแหน่งจะย้าย ฉันต้องทำให้กึ่งอัตโนมัตินี้และมันก็ดีที่จะใช้ API สาธารณะด้วยเหตุผลนั้น
dflemstr

2
การพิจารณาทำงานกับ nsenter (หรือนักเทียบท่า) เพื่อที่จะบรรลุเป้าหมาย แน่นอนว่ามีข้อ จำกัด ในการต้องตรวจสอบรหัส / เครื่องมือภายในภาชนะ
VladFr

ไม่มีวิธีใดในการสั่งให้ Linux ติดข้ามชายแดนคอนเทนเนอร์?
dflemstr

@dflemstr ใช่มี --volumes- จาก kinda ทำสิ่งนั้นดูเหมือนว่าจะรวมกลุ่มของไดเรกทอรีจากอิมเมจพื้นฐานของคอนเทนเนอร์อื่นและไดรฟ์ข้อมูล แต่พฤติกรรมนี้ไม่ได้รับการบันทึก afaik
Tarnay Kálmán

คำตอบ:


10

docker exportลองดูที่

ในการแสดงรายการไฟล์ในคอนเทนเนอร์ของคุณอย่างรวดเร็ว:

docker export CONTAINER|tar -t

ในการส่งออก:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

หรือดูไฟล์:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

นักเทียบท่า 1.8 รองรับ cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

ปรับปรุง: คุณควร ssh กับเครื่องนักเทียบท่าของคุณเมื่อคุณเรียกใช้


2
ภาพของฉันค่อนข้างใหญ่ (หลายร้อย MiB) ดังนั้นการทำเช่นนี้เพื่อดึงไฟล์แต่ละไฟล์นั้นมีค่าใช้จ่ายมากเกินไป มันจะสร้างไฟล์หลายร้อยเมกะไบต์ทุกครั้ง
dflemstr

@dflemstr ใช้บรรทัดที่มีtar x PATH-IN-CONTAINERก็จะแยกไฟล์ที่คุณต้องการ
laktak

... แต่tarไฟล์เก็บถาวรทั้งหมดยังคงถูกสร้างใน Docker daemon และใช้เวลาหลายนาทีในการสร้าง ...
dflemstr

@dflemstr ไม่แน่ใจว่าการตั้งค่าของคุณคืออะไรเช่นdocker export ubuntu|tar -t|grep etc/networkใช้เวลา 3 วินาทีสำหรับฉัน
laktak

คุณอาจกำลังเรียกใช้บนเครื่องเดียวกับ Docker daemon ดังนั้นคุณไม่จำเป็นต้องทำการถ่ายโอนเครือข่ายและubuntuรูปภาพมีขนาดเล็กมาก ...
dflemstr

3

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

จากเอกสาร:

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

หวังว่านี่จะช่วยได้


2

คุณสามารถใช้ nsenter เพื่อรันโปรแกรมตรวจสอบของคุณ (ซึ่งอาจต้องรวมอยู่ในคอนเทนเนอร์แล้ว) ภายในคอนเทนเนอร์ / เนมสเปซ แต่หากต้องการเมานต์ระบบไฟล์คอนเทนเนอร์ตามที่เห็นข้างในคุณจะต้องเมานต์อิมเมจดั้งเดิมและเลเยอร์ทั้งหมดหากเป็น aufs หรือแอ็คชันที่เทียบเท่าสำหรับ mapper อุปกรณ์ btrfs และเอ็นจิ้นการเก็บข้อมูล (อนาคต) อื่น ๆ ที่ใช้แตกต่างกันในแต่ละกรณี อาจจะมีประสิทธิภาพมากกว่าเพื่อให้นักเทียบท่าทำงานให้คุณตรงตามที่ควรจะทำและใช้ nsenter ทำการตรวจสอบภายในคอนเทนเนอร์

มีวิธีการอื่น นักเทียบท่า diff จะแสดงไฟล์ที่เปลี่ยนแปลงในคอนเทนเนอร์นั้นหากคุณต้องการดูว่ามีการเปลี่ยนแปลงอะไรบ้างแทนที่จะเป็นไฟล์ในภาพต้นฉบับ

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


1

แก้ไข: ฉันลองวิธีแก้ปัญหาด้านล่างและน่าเสียดายที่มันใช้งานไม่ได้สำหรับฉันในทางปฏิบัติ ระบบไฟล์ที่เมาท์ไม่ได้สะท้อนถึงระบบไฟล์ของคอนเทนเนอร์อย่างถูกต้อง (แม้จะมีcache=no) ฉันไม่แน่ใจว่านี่เป็นปัญหาพื้นฐานหรือฉันทำอะไรผิดพลาด

คุณสามารถติดตั้ง sshd ในอิมเมจ docker และใช้docker execเพื่อเรียกใช้บริการ ssh ( /usr/sbin/sshd -D) บนคอนเทนเนอร์ docker (โปรดทราบว่าพอร์ต SSH 22 ของคอนเทนเนอร์ docker ต้องถูกเปิดเผย)

จากนั้นใช้docker cpเพื่อคัดลอกคีย์ ssh สาธารณะของคุณไปยัง/root/.ssh/authorized_keysไดเรกทอรีของคอนเทนเนอร์นักเทียบท่า

สุดท้ายใช้docker inspectเพื่อค้นหาที่อยู่ IP ของคอนเทนเนอร์และติดตั้งระบบไฟล์ของคอนเทนเนอร์โดยใช้

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

คุณต้องเขียนสคริปต์เพื่อให้การทำงานนี้เป็นไปอย่างสะดวกสบายในทางปฏิบัติ

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