วิธีดูเนื้อหารูปภาพนักเทียบท่า


295

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


2
อาจเป็นไปได้ซ้ำกับระบบไฟล์
Vadzim

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

4
หากคุณไม่สามารถเรียกใช้อิมเมจเป็นคอนเทนเนอร์คุณสามารถใช้เครื่องมือเช่นไดรฟ์ ( github.com/wagoodman/dive ) หรือคุณสามารถใช้ docker save เพื่อส่งออกรูปภาพเป็นไฟล์ tar จากนั้นคุณสามารถสำรวจน้ำมันดินหรือด้วยการดำน้ำคุณสามารถสำรวจภาพได้โดยเร็ว
FunThomas424242

ไม่ใช่คนหลงกล แต่คุณสามารถหาคำตอบได้ที่นี่: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

คำตอบ:


377

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

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

docker run -it image_name sh

หรือติดตามภาพด้วย entrypoint

docker run -it --entrypoint sh image_name

หรือถ้าคุณต้องการดูว่าภาพนั้นถูกสร้างขึ้นอย่างไรหมายถึงขั้นตอนในภาพDockerfileนั้นคุณสามารถ:

docker image history --no-trunc image_name > image_history

ขั้นตอนจะถูกบันทึกลงในimage_historyไฟล์


1
ขอบคุณ อย่างแรกคือสิ่งที่ฉันกำลังมองหา สำรวจโฟลเดอร์โดยทั่วไป
pylearn

9
ฉันกำลังพยายามดูเนื้อหาของรูปภาพที่สร้างขึ้นโดยใช้ "FROM scratch" และไม่มีเชลล์อยู่ มีวิธีอื่นอีกไหมในการดูเนื้อหา? ภาพที่ฉันพยายามจะดูคือตัวยึด / ตัวยึด
Juan Hernandez

2
เป็นไปได้ไหมที่บางคนเห็นเนื้อหาของภาพโดยไม่ต้องวางไข่ในภาชนะ หรือเราสามารถสันนิษฐานได้ว่ามันปลอดภัยจากทุกคนเว้นแต่พวกเขาจะมีสิทธิในการวางภาชนะจากมัน?
Shabirmean

3
การรวมสิ่งที่บอกไว้ก่อนหน้า "สำหรับคอนเทนเนอร์ windows กับจุดเข้าใช้งาน": docker run -it --entrypoint cmd <image_name>จะใช้งานได้
Beytan Kurt

2
@JuanHernandez ใช่คุณสามารถถ่ายโอนข้อมูลเนื้อหาเต็มรูปแบบของภาพตามที่ระบุไว้ในstackoverflow.com/a/42677219/320594
Jaime Hablutzel

197

คำตอบที่ยอมรับได้ที่นี่เป็นปัญหาเนื่องจากไม่มีการรับประกันว่าภาพจะมีเชลล์แบบโต้ตอบใด ๆ ยกตัวอย่างเช่นเสียงหึ่ง / เสียงหึ่งภาพมีในคำสั่งเดียว/drone, และก็มีENTRYPOINTเช่นกันดังนั้นนี้จะล้มเหลว:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

และสิ่งนี้จะล้มเหลว:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

นี่ไม่ใช่การกำหนดค่าที่ผิดปกติ รูปภาพขั้นต่ำสุดจำนวนมากมีเพียงไบนารีที่จำเป็นในการสนับสนุนบริการเป้าหมาย โชคดีที่มีกลไกสำหรับการสำรวจระบบไฟล์ภาพที่ไม่ได้ขึ้นอยู่กับเนื้อหาของภาพ วิธีที่ง่ายที่สุดน่าจะเป็นdocker exportคำสั่งซึ่งจะส่งออกระบบไฟล์คอนเทนเนอร์เป็นไฟล์เก็บถาวร tar ดังนั้นเริ่มภาชนะ (มันไม่สำคัญว่าจะล้มเหลวหรือไม่):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

จากนั้นใช้docker exportเพื่อส่งออกระบบไฟล์ไปที่tar:

$ docker export $(docker ps -lq) | tar tf -

docker ps -lqมีความหมายว่า "ให้ฉันรหัสของคอนเทนเนอร์นักเทียบท่าล่าสุด" คุณสามารถแทนที่ด้วยชื่อคอนเทนเนอร์หรือรหัสที่ชัดเจน


5
คำตอบนี้มีประโยชน์อย่างยิ่งในการคิดว่าจะมีอะไรในตู้คอนเทนเนอร์ในเวลาที่กำหนด
João Andrade

2
คำตอบนี้ถูกต้องมากขึ้นและใช้งานได้สำหรับฉันเนื่องจากฉันต้องการสำรวจเนื้อหาของภาพด้วยสถาปัตยกรรมต่างประเทศและฉันไม่สามารถ "แค่เรียกใช้" มันได้
Vladimir Perevalov

95

คุณไม่ควรเริ่มคอนเทนเนอร์เพื่อดูเนื้อหารูปภาพ ตัวอย่างเช่นคุณอาจต้องการค้นหาเนื้อหาที่เป็นอันตรายไม่ทำงาน ใช้ "สร้าง" แทน "เรียกใช้";

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
บรรทัดที่ 2 ด้านบนแสดงรายการเนื้อหาของระบบไฟล์ docker export tmp_$$ > image-fs.tarหากคุณต้องการที่จะได้รับไฟล์ทั้งหมดที่เป็นน้ำมันดินคุณสามารถแทนที่ด้วยสิ่งที่ชอบ
Pino

บรรทัดที่ 2 สำหรับระบบปฏิบัติการ Windows คืออะไร docker export tmp_$$ | tar tจะไม่ทำงาน
Alexei Marinichenko

@Alexei Marinichenko tarอาจไม่ได้ติดตั้งไว้ในเครื่องของคุณ ลองtar --helpตรวจสอบดู
Abdurrahman I.

1
วิธีนี้จะใช้งานได้หากไม่มีเชลล์ในคอนเทนเนอร์
Peter Dotchev

3
@AlexeiMarinichenko คุณสามารถใช้-oพารามิเตอร์เพื่อระบุไฟล์ที่จะเขียน docker export -o c:\temp\tmp_$$.tar tmp_$$เช่น
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

ไฟล์ต่อไปนี้มีอยู่:

  • manifest.json - อธิบายเลเยอร์ระบบไฟล์และชื่อของไฟล์ json ที่มีคุณสมบัติ Container
  • .json - คุณสมบัติคอนเทนเนอร์
  • - แต่ละไดเรกทอรี“ layerid” มีไฟล์ json อธิบายคุณสมบัติของชั้นและระบบไฟล์ที่เกี่ยวข้องกับชั้นที่ Docker จัดเก็บอิมเมจคอนเทนเนอร์เป็นเลเยอร์เพื่อปรับพื้นที่จัดเก็บให้เหมาะสมโดยนำเลเยอร์ซ้ำข้ามภาพ

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

หรือ

คุณสามารถใช้การดำน้ำเพื่อดูเนื้อหาภาพแบบโต้ตอบกับ TUI

ป้อนคำอธิบายรูปภาพที่นี่

https://github.com/wagoodman/dive


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

1
เห็นด้วยอย่างแน่นอน @AlecThomas - และเพื่อก้าวไปอีกขั้นหนึ่งทำไมฉันถึงต้องการdockerเพียงแค่เห็นเนื้อหาของสิ่งที่เป็นหลักเพียงไฟล์เก็บถาวรประเภทอื่น
Ed Randall

คำตอบที่ดีฉันจะระบุแท็ก: docker save --output nginx.tar nginx:latestมิฉะนั้นตามเอกสารนั้นจะมี "เลเยอร์ผู้ปกครองทั้งหมดและแท็ก + รุ่นทั้งหมด"
Tarek

สิ่งนี้ควรได้รับการอัปเดตเนื่องจากนี่อาจเป็นวิธีเดียวที่จะสำรวจ internals หากคุณไม่มี Unix utils ภายใน ด้วยวิธีนี้ไม่จำเป็นต้องสร้างภาชนะ
Stanislav German-Evtushenko

9

ในการแสดงรายการเนื้อหาโดยละเอียดของรูปภาพคุณจะต้องเรียกใช้ในdocker run --rm image/name ls -alRที่ซึ่ง--rmหมายความว่าจะลบออกทันทีที่ออกจากคอนเทนเนอร์

ป้อนคำอธิบายรูปภาพที่นี่


11
นี่ถือว่าเป็นภาพที่มีlsอยู่และในPATH
chaosaffe

6

สำรวจภาพ DOCKER !

  1. คิดออกว่าชนิดของเปลือกหอยที่อยู่ในนั้นbashหรือshหรือ ...

    ตรวจสอบภาพก่อน: docker inspect name-of-container-or-image

    ค้นหาentrypointหรือcmdในการส่งคืน json

  2. จากนั้นทำ: docker run --rm -it --entrypoint=/bin/bash name-of-image

    เมื่อภายในทำ: ls -lsaหรือคำสั่งเชลล์อื่น ๆ เช่น:cd ..

    -itย่อมาโต้ตอบ ... และ TTY --rmย่อมาจากตู้คอนเทนเนอร์ลบหลังจากที่วิ่ง


1
ปัญหาเกี่ยวกับคำตอบนี้คือตามที่กล่าวไว้ในคำตอบที่ยอมรับไม่มีการรับประกันว่าภาพของคุณมีเปลือกหอยใด ๆในนั้น lsหรือ หรือเครื่องมือทั่วไปใด ๆ เลย
larsks

3

เราสามารถลองแบบง่ายกว่านี้ได้ดังนี้:

docker image inspect image_id

สิ่งนี้ทำงานในเวอร์ชัน Docker:

DockerVersion": "18.05.0-ce"

13
นี้ไม่ได้แสดงเนื้อหา ; มันแสดงเฉพาะเลเยอร์ ฯลฯ ที่เข้าไปสร้างภาพ
Roger Lipscombe

0

ด้วย Docker EE สำหรับ Windows (17.06.2-ee-6 บน Hyper-V Server 2016) เนื้อหาทั้งหมดของ Windows Containers สามารถตรวจสอบได้ที่C:\ProgramData\docker\windowsfilter\พา ธ ของโฮสต์ระบบปฏิบัติการ

ไม่จำเป็นต้องติดตั้งพิเศษ

คำนำหน้าโฟลเดอร์สามารถพบได้โดยรหัสภาชนะจากdocker ps -aเอาท์พุท


-1

มีเครื่องมือโอเพนซอร์สฟรีที่เรียกว่า Anchore ที่คุณสามารถใช้ในการสแกนภาพภาชนะ คำสั่งนี้จะช่วยให้คุณสามารถแสดงรายการไฟล์ทั้งหมดในภาพภาชนะ

เนื้อหาภาพ anchore-cli myrepo / app: ไฟล์ล่าสุด

https://anchore.com/opensource/

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