สำรวจระบบไฟล์ของคอนเทนเนอร์ Docker


651

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

สิ่งที่จะเหมาะคือการสามารถ ssh เป็นพวกเขาหรือเทียบเท่า มีเครื่องมือในการทำเช่นนี้หรือเป็นแนวคิดของนักเทียบท่าของฉันผิดคิดว่าฉันควรจะสามารถทำเช่นนี้


13
ใน Docker เวอร์ชันล่าสุดบางสิ่งเช่นนี้เป็นไปได้: docker exec <container> bash. ดังนั้นคุณเพียงแค่เปิดเปลือกภายในภาชนะ
dashohoxha

7
การใช้ bash บนคอนเทนเนอร์ใช้งานได้เฉพาะเมื่อมีการติดตั้ง bash ภายในคอนเทนเนอร์
Christopher Thomas

7
ในทำนองเดียวกันคุณสามารถทำได้: และdocker exec <container> ls <dir path> docker exec <container> cat <file path>อย่างไรก็ตามสำหรับทุบตีเพิ่ม-itตัวเลือก
Noam Manos

คำถามที่คล้ายกัน: stackoverflow.com/questions/44769315/…
Vadzim

3
@ChristopherThomas แน่นอน เนื่องจากการที่ฉันได้พบว่าวิธีเดียวที่มีประสิทธิภาพในการทำเช่นนี้คือพร้อมกับdocker image save image_name > image.tarที่ระบุไว้ในการตอบสนองจาก @ Gaurav24
Jaime Hablutzel

คำตอบ:


736

อัปเดต
วิธีที่ง่ายที่สุด: การใช้นักเทียบท่า exec

รุ่นหาง 1.3 หรือใหม่กว่าสนับสนุนคำสั่งว่าจะประพฤติที่คล้ายกันexec nsenterคำสั่งนี้สามารถเรียกใช้กระบวนการใหม่ในคอนเทนเนอร์ที่กำลังทำงานอยู่แล้ว (คอนเทนเนอร์ต้องมีกระบวนการ PID 1 ทำงานอยู่แล้ว) คุณสามารถเรียกใช้/bin/bashเพื่อสำรวจสถานะคอนเทนเนอร์:

docker exec -t -i mycontainer /bin/bash

ดูเอกสารคู่มือบรรทัดคำสั่งของนักเทียบท่า

วิธีอื่น 1 การจับ
ภาพ

คุณสามารถประเมินระบบไฟล์คอนเทนเนอร์ด้วยวิธีนี้:

# find ID of your running container:
docker ps

# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot

# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash

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

คุณสามารถลบสแนปชอตในภายหลังได้ (ระบบไฟล์ของคอนเทนเนอร์ที่รันอยู่ไม่ได้รับผลกระทบ!):

docker rmi mysnapshot

วิธีอื่น 2
ssh

หากคุณต้องการเข้าถึงอย่างต่อเนื่องคุณสามารถติดตั้ง sshd ไปยังคอนเทนเนอร์ของคุณและรัน sshd daemon:

 docker run -d -p 22 mysnapshot /usr/sbin/sshd -D

 # you need to find out which port to connect:
 docker ps

ด้วยวิธีนี้คุณสามารถเรียกใช้แอปของคุณโดยใช้ ssh (เชื่อมต่อและรันสิ่งที่คุณต้องการ)

UPDATE: วิธีการสำรอง 3
nsenter

ใช้nsenterดูhttps://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

เวอร์ชันย่อคือ: ด้วย nsenter คุณสามารถรับเชลล์ลงในคอนเทนเนอร์ที่มีอยู่แม้ว่าคอนเทนเนอร์นั้นจะไม่รัน SSH หรือ daemon วัตถุประสงค์พิเศษชนิดใด ๆ


6
แต่หมายเหตุถ้าคุณต้องการเข้าถึงไฟล์ให้ใช้คำสั่ง "docker cp" การใช้งาน: docker cp คอนเทนเนอร์: PATH HOSTPATH ​​คัดลอกไฟล์ / โฟลเดอร์จากระบบไฟล์คอนเทนเนอร์ไปยังโฮสต์พา ธ พา ธ สัมพันธ์กับรูทของระบบไฟล์ #> นักเทียบท่า cp 7bb0e258aefe: / etc / debian_version #> docker cp blue_frog: / etc / hosts
Amos Folarin

4
ทางเลือกที่ 4 Option 1เป็นสิ่งสำคัญที่มันควรจะย้ายไปอยู่ด้านบนและเปลี่ยนชื่อเป็น
automorphic

5
@JanusTroelsen หากไม่มีเชลล์คุณสามารถติดตั้งได้ - ตัวอย่างเช่นใน dockerfile สำหรับ alpine linux (ซึ่งแน่นอนไม่มีเชลล์) โดย: RUN apk update && apk add bash(ขนาด: ~ 4MB)
Kamil Kiełczewski

2
จากประสบการณ์ของฉันเองข้อ จำกัด ของตัวจัดการ Docker ก็คือต้องเพิ่มคำสั่งลงในคอนเทนเนอร์ที่รันอยู่หรือเป็นจุดเข้าใช้งานชนิดหนึ่ง ดังนั้นคอนเทนเนอร์ที่หยุดทำงานอยู่นอกขอบเขตของวิธีนี้
Webwoman

1
ในการใช้งาน linux shell ของ Windowdocker exec -t -i mycontainer /bin/sh
Jason Masters

266

อัปเดต: สำรวจ!

คำสั่งนี้จะช่วยให้คุณสำรวจคอนเทนเนอร์นักเทียบท่าที่ใช้งานอยู่ :

docker exec -it name-of-container bash

สิ่งนี้จะเทียบได้กับนักเทียบท่าในการเขียน:

docker-compose exec web bash

(เว็บเป็นชื่อบริการในกรณีนี้และมี tty เป็นค่าเริ่มต้น)

เมื่อคุณอยู่ภายในทำ:

ls -lsa

หรือคำสั่ง bash อื่น ๆ เช่น:

cd ..

คำสั่งนี้จะให้คุณสำรวจภาพนักเทียบท่า :

docker run --rm -it --entrypoint=/bin/bash name-of-image

เมื่อภายในทำ:

ls -lsa

หรือคำสั่ง bash อื่น ๆ เช่น:

cd ..

-itย่อมาโต้ตอบ ... และ TTY


คำสั่งนี้จะช่วยให้คุณตรวจสอบคอนเทนเนอร์หรืออิมเมจที่ทำงานอยู่ :

docker inspect name-of-container-or-image

คุณอาจต้องการทำสิ่งนี้และดูว่ามีbashหรือshนั่น ค้นหาจุดเข้าใช้งานหรือ cmd ในการส่งคืน json

ดูเอกสารประกอบนักเทียบท่า exec

โปรดดูเอกสารประกอบคำสั่ง exec-docker

ดูเอกสารตรวจสอบนักเทียบท่า


1
มันมีประโยชน์มากจริงๆขอบคุณ! ฉันต้องลากและวางไฟล์ที่มีอยู่ภายในโครงสร้างไฟล์ภาพของนักเทียบท่าลงในแอปพลิเคชัน แต่จะไม่สามารถทำได้เว้นแต่จะเปิดในรูปแบบ GUI ความคิดใดที่ฉันสามารถแก้ไขได้?
Arkya Chatterjee

2
ควรชัดเจนว่าจะใช้งานได้กับคอนเทนเนอร์ที่ติดตั้ง bash เท่านั้น
วิศวกรซอฟต์แวร์

2
สำหรับทุกคนที่มองหาวิธีที่จะทำเช่นนี้ใน Windows คอนเทนเนอร์ / Powershell คำสั่งมีdocker exec -ti <name> powershell( แหล่งที่มา )
ssell

1
@ssell ภาชนะ / ภาพของฉันไม่ได้มี PowerShell ด้วยเหตุผลบางอย่างเพื่อให้docker exec -ti <name> cmdทำงาน และสำหรับมือใหม่คนอื่น ๆ เช่นตัวฉันเองให้ใช้ชื่ออินสแตนซ์คอนเทนเนอร์จากdocker ps(เช่น 070494393ca5) แทนที่จะเป็นชื่อที่คุณสามารถอ่านได้
Simon_Weaver

1
เกี่ยวกับ PowerShell ในภาพgithub.com/aspnet/aspnet-docker/issues/362 - และถ้าคุณต้องการเพียงขดบนภาพหน้าต่าง: blogs.technet.microsoft.com/virtualization/2017/12/19/...
Simon_Weaver

162

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

คุณสามารถเก็บระบบไฟล์ของคอนเทนเนอร์ลงในไฟล์ tar

docker export adoring_kowalevski > contents.tar

หรือรายการไฟล์:

docker export adoring_kowalevski | tar t

โปรดทราบว่าอาจใช้เวลาและพื้นที่ดิสก์นานขึ้นอยู่กับภาพ


12
ฉันต้องการแสดงรายการเนื้อหาของคอนเทนเนอร์ที่ไม่ได้ติดตั้งเครื่องมือ UNIX มาตรฐาน รูปแบบของexportตัวอย่างด้านบนมีจุด:docker export adoring_kowalevski | tar tf -
berto

3
คำเตือนถึงสิ่งที่ไม่ระมัดระวัง: สิ่งนี้อาจส่งออกข้อมูลจำนวนมาก (> GB) และใช้เวลานาน
Vince Bowdren

5
@ ไม่ว่ามันจะเป็นเรื่องใหญ่ แต่คุณไม่จำเป็นต้องใช้f -คำสั่งที่ท้ายคำสั่ง tar อ่านจากอินพุตมาตรฐานเป็นค่าเริ่มต้น ใช้docker export adoring_kowalevski | tar tงานได้ง่าย
Shaun Bouckaert

ง่ายกว่าดีกว่า; ยอดเยี่ยมขอบคุณสำหรับเคล็ดลับ! 🙌🏽
berto

1
@ShaunBouckaert ค่าเริ่มต้นtar fขึ้นอยู่กับการกำหนดค่า ส่วนหนึ่งคือTAPEตัวแปรสภาพแวดล้อม คนอื่น ๆ ถูกควบคุมเป็นส่วนหนึ่งของการสร้าง ผลกระทบสุทธิคือเราไม่ควรคิดว่าจะอ่านstdinหรือเขียนstdoutแต่จะระบุอย่างชัดเจนเสมอ
roaima

42

ระบบไฟล์ของคอนเทนเนอร์อยู่ในโฟลเดอร์ data ของ docker ซึ่งโดยปกติจะอยู่ใน / var / lib / docker ในการเริ่มและตรวจสอบระบบไฟล์ที่กำลังรันให้ทำดังต่อไปนี้:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

และตอนนี้ไดเรกทอรีทำงานปัจจุบันคือรูทของคอนเทนเนอร์


3
สิ่งนี้จะไม่รวมถึงโวลุ่มที่เมาท์ใด ๆ
hwjp

34

ก่อนสร้างคอนเทนเนอร์:

หากคุณสำรวจโครงสร้างของภาพที่ติดตั้งอยู่ภายในคอนเทนเนอร์คุณสามารถทำได้

sudo docker image save image_name > image.tar
tar -xvf image.tar

สิ่งนี้จะทำให้คุณมองเห็นเลเยอร์ทั้งหมดของรูปภาพและการกำหนดค่าซึ่งมีอยู่ในไฟล์ json

หลังจากสร้างภาชนะ:

สำหรับเรื่องนี้มีคำตอบมากมายอยู่แล้วข้างต้น วิธีที่ฉันชอบในการทำเช่นนี้คือ -

docker exec -t -i container /bin/bash

ดูเกินไปsreeninet.wordpress.com/2016/06/11/...
Jaime Hablutzel

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

@ MaximKulkin จริงเหรอ? หากคอนเทนเนอร์เป็น Linux มันไม่สำคัญว่าโฮสต์คืออะไรถ้ามี bash อยู่ บางทีคุณอาจนึกถึงคอนเทนเนอร์ของ Windows
Thorbjørn Ravn Andersen

26

คำตอบที่ upvoted ที่สุดทำงานกับฉันเมื่อเริ่มต้นคอนเทนเนอร์จริง แต่เมื่อไม่สามารถเรียกใช้และคุณต้องการคัดลอกไฟล์จากคอนเทนเนอร์สิ่งนี้ได้บันทึกไว้ก่อนหน้านี้:

docker cp <container-name>:<path/inside/container> <path/on/host/>

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

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

โปรดทราบว่าคุณไม่จำเป็นต้องระบุว่าคุณต้องการคัดลอกซ้ำ


6
เหตุใดจึงไม่มี +1 มากกว่านี้! วิธีที่ดีที่สุดอย่างแน่นอน
Nicholas DiP Piazza

สิ่งนี้ง่ายกว่าการส่งออกทาง tar ฉันต้องใช้ -L เพื่อไปยังไฟล์ผ่าน symlink ไม่จำเป็นต้องเรียกใช้คอนเทนเนอร์!
MKaama

17

ในUbuntu 14.04 ที่รันDocker 1.3.1ฉันพบระบบไฟล์รูทคอนเทนเนอร์บนเครื่องโฮสต์ในไดเรกทอรีต่อไปนี้:

/var/lib/docker/devicemapper/mnt/<container id>/rootfs/

ข้อมูลเวอร์ชั่น Docker เต็ม:

Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa

ทำงานเหมือนเครื่องราง: name = <name> dockerId = $ (นักเทียบท่าตรวจสอบ -f {{.Id}} $ name) / var / lib / docker / devicemapper / mnt / $ dockerId / rootfs /
Florent

3
ด้วย Ubuntu 16.10 และนักเทียบท่า 1.12.1 นี่เป็นกรณีที่น่าเสียดายอีกต่อไป (ไม่มีdevicemapperไดเรกทอรี) /var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...ไฟล์ที่มีอยู่ภายใต้ ฉันไม่แน่ใจว่าวิธีพกพา / ปลอดภัยในการเข้าถึงไฟล์ที่นั่น
WoJ

1
เริ่มต้นจาก 1.10 นักเทียบท่านำเสนอโมเดลหน่วยเก็บข้อมูลที่กำหนดแอดเดรสได้ซึ่งไม่ได้ใช้ UUID ที่สร้างขึ้นแบบสุ่มซึ่งก่อนหน้านี้เป็นทั้งสำหรับเลเยอร์และตัวระบุคอนเทนเนอร์ ในรูปแบบใหม่นี้จะถูกแทนที่ด้วยแฮชเนื้อหาที่ปลอดภัยสำหรับเลเยอร์ id ดังนั้นวิธีนี้จะไม่ทำงานอีกต่อไป
Artem Dolobanko

นี่ไม่ใช่แบบพกพาและขึ้นอยู่กับการเลือกไดรเวอร์อุปกรณ์เก็บข้อมูลเป็นอย่างมาก ไม่แน่ใจว่าจะแก้ปัญหาด้วยdirect-lvmเช่น
rustyx

14

ลองใช้ดู

docker exec -it <container-name> /bin/bash

อาจมีความเป็นไปได้ที่จะไม่มีการทุบตี เพื่อที่คุณสามารถใช้

docker exec -it <container-name> sh

12

ฉันใช้เคล็ดลับสกปรกอีกอย่างที่เป็นผู้ไม่เชื่อเรื่องพระเจ้าและ devicemapper

ฉันดูคำสั่งที่คอนเทนเนอร์ทำงานเช่นdocker ps และถ้าเป็น apache หรือjavaฉันทำต่อไปนี้:

sudo -s
cd /proc/$(pgrep java)/root/

และvoiláคุณอยู่ในภาชนะ

โดยทั่วไปคุณสามารถรูทซีดีลงใน/proc/<PID>/root/โฟลเดอร์ได้ตราบใดที่กระบวนการนั้นถูกเรียกใช้โดยคอนเทนเนอร์ ระวัง symlink จะไม่สมเหตุสมผลถ้าใช้โหมดนั้น


ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนี้ที่นี่: superuser.com/a/1288058/195840
Eduardo Lucio

12

คำตอบที่ได้รับการโหวตมากที่สุดนั้นดียกเว้นว่าที่เก็บของคุณไม่ใช่ระบบ Linux จริง

คอนเทนเนอร์จำนวนมาก (โดยเฉพาะอย่างยิ่งที่อิงตาม Go) ไม่มีไบนารีมาตรฐานใด ๆ (ไม่/bin/bashหรือ/bin/sh) ในกรณีดังกล่าวคุณจะต้องเข้าถึงไฟล์คอนเทนเนอร์จริงโดยตรง:

ทำงานเหมือนมีเสน่ห์:

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

หมายเหตุ: คุณต้องเรียกใช้เป็นรูท


สิ่งนี้ไม่ทำงานอีกต่อไป โฟลเดอร์ devicemapper ไม่ได้อยู่ที่นั่น
0xcaff

มันคงจะดีถ้าคนที่มีคำตอบที่ล้าสมัยจะทำความสะอาดพวกเขา
Matthew Purdon

2
ฉันปรับปรุงคำสั่งเพื่อให้ตรงกับโครงสร้างที่เก็บข้อมูลของนักเทียบท่าใหม่
Florent

10

shในกรณีของฉันเปลือกไม่ได้รับการสนับสนุนในภาชนะยกเว้น ดังนั้นมันใช้งานได้ดีเหมือนมีเสน่ห์

docker exec -it <container-name> sh


5

วิธีนี้จะเริ่มเซสชัน bash สำหรับภาพ:

นักเทียบท่าวิ่ง --rm -it --entrypoint = / bin / bash


1
สิ่งนี้มีประโยชน์สำหรับเมื่อจุดเริ่มต้นเริ่มต้นไม่ทำงาน
แยกวิเคราะห์

4

สำหรับฉันอันนี้ใช้งานได้ดี (ขอบคุณความคิดเห็นล่าสุดสำหรับการชี้ให้ไดเรกทอรี/ var / lib / docker / ):

chroot /var/lib/docker/containers/2465790aa2c4*/root/

ที่นี่2465790aa2c4เป็นรหัสย่อของคอนเทนเนอร์ที่ใช้งาน (ตามที่แสดงโดยdocker ps ) ตามด้วยดาว


4

ใน Docker เวอร์ชันใหม่กว่าคุณสามารถเรียกใช้ได้ docker exec [container_name]ซึ่งรันเชลล์ภายในคอนเทนเนอร์ของคุณ

ดังนั้นเพื่อให้ได้รายชื่อของไฟล์ทั้งหมดในคอนเทนเนอร์ที่เพิ่งรัน docker exec [container_name] ls


1
ฉันลองมันแล้วมันใช้งานไม่ได้ คำแนะนำของ Khalil Gharbaoui ทำงานได้ดีกว่า
Nick

ที่ทำงานให้ฉัน นอกจากนี้คุณยังสามารถลองใช้รหัสภาชนะแทนชื่อภาพ
Diwann

4

สำหรับไดรเวอร์นักเทียบท่า aufs:

สคริปต์จะค้นหา dir ของรูทคอนเทนเนอร์ (ทดสอบกับนักเทียบท่า 1.7.1 และ 1.10.3)

if [ -z "$1" ] ; then
 echo 'docker-find-root $container_id_or_name '
 exit 1
fi
CID=$(docker inspect   --format {{.Id}} $1)
if [ -n "$CID" ] ; then
    if [ -f  /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
        F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
       d1=/var/lib/docker/aufs/mnt/$F1
    fi
    if [ ! -d "$d1" ] ; then
        d1=/var/lib/docker/aufs/diff/$CID
    fi
    echo $d1
fi

4

ไม่มีคำตอบที่มีอยู่ในกรณีของภาชนะที่ออก (และไม่สามารถเริ่มต้นใหม่) และ / หรือไม่มีการติดตั้งเชลล์ใด ๆ (เช่น distroless) อันนี้ใช้งานได้ตราบใดที่คุณมีการเข้าถึงรูทไปยังโฮสต์นักเทียบท่า

สำหรับการตรวจสอบด้วยตนเองจริงให้ค้นหา ID เลเยอร์ก่อน:

docker inspect my-container | jq '.[0].GraphDriver.Data'

ในผลลัพธ์คุณควรเห็นสิ่งที่ต้องการ

"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"

นำทางไปยังโฟลเดอร์นี้ (เป็น root) เพื่อค้นหาสถานะปัจจุบันที่มองเห็นได้ของระบบไฟล์คอนเทนเนอร์


3

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

รายการคอนเทนเนอร์ที่ใช้นักเทียบท่า:

docker ps

=> ID คอนเทนเนอร์ "4c721f1985bd"

ดูที่จุดเมานต์ระดับเสียงของนักเทียบท่าบนเครื่องจริงของคุณ ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):

docker inspect -f {{.Mounts}} 4c721f1985bd

=> [{/ tmp / container-garren / tmp true rprivate}]

สิ่งนี้บอกฉันว่าไดเร็กทอรีเครื่องฟิสิคัลโลคัล / tmp / container-garren ถูกแม็พกับปลายทางวอลุ่ม / tmp docker

รู้ไดเรกทอรีเครื่องทางกายภาพท้องถิ่น (/ tmp / container-garren) หมายความว่าฉันสามารถสำรวจระบบไฟล์หรือไม่ว่าภาชนะนักเทียบท่ากำลังทำงานอยู่ นี่เป็นเรื่องสำคัญอย่างยิ่งที่จะช่วยให้ฉันทราบว่ามีข้อมูลที่เหลือซึ่งไม่ควรยืนยันแม้ว่าภาชนะจะไม่ทำงาน


1
นี่จะค้นหาไดเร็กทอรีโลคัลที่เมาต์เป็นวอลุ่มภายในคอนเทนเนอร์ แต่ไม่อนุญาตให้เข้าถึงระบบไฟล์ทั้งหมดของคอนเทนเนอร์
Bojan Komazec

3

เคล็ดลับอีกอย่างคือการใช้เครื่องมืออะตอมมิกเพื่อทำสิ่งที่ชอบ:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

ภาพนักเทียบท่าจะถูกติดตั้งที่/ path / to / mntเพื่อให้คุณตรวจสอบ


แต่คุณต้องมีภาชนะที่ทำขึ้นเป็นพิเศษเพื่อให้ใช้งานได้ใช่ไหม บางทีคุณควรเพิ่มมันเป็นข้อแม้ทำให้คนส่วนใหญ่ไม่สามารถขายให้กับทีม / บริษัท ของพวกเขาเป็นวิธีแก้ปัญหา ...
Angelos Pikoulas

3

สำหรับ LINUX เท่านั้น

วิธีที่ง่ายที่สุดที่ฉันใช้คือใช้ proc dir ซึ่งเป็นคอนเทนเนอร์ที่จะต้องทำงานเพื่อตรวจสอบไฟล์คอนเทนเนอร์ของนักเทียบท่า

  1. ค้นหา id กระบวนการ (PID) ของคอนเทนเนอร์และเก็บลงในตัวแปรบางตัว

    PID = $ (นักเทียบท่าตรวจสอบ -f '{{.State.Pid}}' your-container-name-here

  2. ตรวจสอบให้แน่ใจว่ากระบวนการคอนเทนเนอร์กำลังทำงานและใช้ตัวแปรเพื่อเข้าไปในโฟลเดอร์คอนเทนเนอร์

    cd / proc / $ PID / root

หากคุณต้องการผ่าน dir โดยไม่ต้องค้นหาหมายเลข PID เพียงแค่ใช้คำสั่งยาวนี้

cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root

เคล็ดลับ:

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

หวังว่ามันจะช่วย

บันทึก:

วิธีนี้ใช้งานได้เฉพาะถ้าคอนเทนเนอร์ยังคงทำงานอยู่มิฉะนั้นไดเรกทอรีจะไม่อยู่อีกต่อไปหากคอนเทนเนอร์หยุดทำงานหรือลบออก


2

วิธีที่ฉันชอบที่จะเข้าใจสิ่งที่เกิดขึ้นภายในคอนเทนเนอร์คือ:

  1. เปิดเผย -p 8000

    docker run -it -p 8000:8000 image
    
  2. เริ่มเซิร์ฟเวอร์ภายใน

    python -m SimpleHTTPServer
    

2

สำหรับคอนเทนเนอร์ที่ใช้งานอยู่คุณสามารถทำสิ่งต่อไปนี้

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

คุณจำเป็นต้องรูทเพื่อที่จะ cd ลงใน dir นั้น หากคุณไม่รูทให้ลอง 'sudo su' ก่อนรันคำสั่ง

แก้ไข: การติดตาม v1.3 ดูคำตอบของ Jiri - ดีกว่า


4
ฉันเป็นบางส่วนอย่างยิ่งที่จะ "sudo -i" มากกว่า "sudo su" เพราะมีเหตุผลเพียงเล็กน้อยที่จะเรียกใช้โปรแกรม suid ซึ่งเปิดตัวโปรแกรม suid อีกโปรแกรมหนึ่งซึ่งเปิดตัวเชลล์ ตัดชายกลางออก :)
dannysauer

คำตอบของคุณดีมากมีเพียงเส้นทางเท่านั้น คุณควรใช้เส้นทางของ piercebot
Florent

2

หากคุณใช้ Docker v19.03 คุณทำตามขั้นตอนด้านล่าง

# find ID of your running container:

  docker ps

# create image (snapshot) from container filesystem

  docker commit 12345678904b5 mysnapshot

# explore this filesystem 

  docker run -t -i mysnapshot /bin/sh

1

หากคุณใช้ไดรเวอร์หน่วยเก็บข้อมูล AUFS คุณสามารถใช้สคริปต์docker -layerของฉันเพื่อค้นหารูทของระบบไฟล์ (mnt) ของรูทคอนเทนเนอร์และเลเยอร์ readwrite:

# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt      : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f

แก้ไข 2018-03-28: docker
-layer ถูกแทนที่ด้วยdocker-backup


1

docker execคำสั่งเพื่อเรียกใช้คำสั่งในภาชนะที่ทำงานสามารถช่วยในหลายกรณี

การใช้งาน: นักเทียบท่า exec [ตัวเลือก] คำสั่งภาชนะบรรจุ [ARG ... ]

เรียกใช้คำสั่งในคอนเทนเนอร์ที่รันอยู่

ตัวเลือก:
  -d, --detach โหมดเดี่ยว: รันคำสั่งในพื้นหลัง
      --detach-keys สตริงแทนที่ลำดับคีย์สำหรับการถอด
                             ภาชนะ
  -e, --env list ตั้งค่าตัวแปรสภาพแวดล้อม
  -i, - เปิดใช้งาน STDIN อย่างต่อเนื่องแม้ว่าจะไม่ได้เชื่อมต่อก็ตาม
      - สิทธิพิเศษให้สิทธิ์เพิ่มเติมในคำสั่ง
  -t, --tty จัดสรรหลอก -TTY
  -u, - ชื่อผู้ใช้สตริงหรือ UID สตริง (รูปแบบ:
                             [:])
  -w, - สตริงทำงานไดเรกทอรีการทำงานภายในภาชนะ

ตัวอย่างเช่น :

1) การเข้าถึงใน bash กับระบบไฟล์คอนเทนเนอร์ที่รันอยู่:

docker exec -it containerId bash 

2) การเข้าถึงทุบตีระบบไฟล์คอนเทนเนอร์ที่รันอยู่ในฐานะรูทเพื่อให้มีสิทธิ์ที่จำเป็น:

docker exec -it -u root containerId bash  

สิ่งนี้มีประโยชน์อย่างยิ่งที่จะสามารถทำการประมวลผลบางอย่างในฐานะรูทในคอนเทนเนอร์

3) การเข้าถึงใน bash ไปยังระบบไฟล์คอนเทนเนอร์ที่กำลังทำงานด้วยไดเรกทอรีทำงานเฉพาะ:

docker exec -it -w /var/lib containerId bash 

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