ดูคำสั่งทั้งหมดของการทำงาน / หยุดคอนเทนเนอร์ใน Docker


263

ฉันจะดูคำสั่งทั้งหมดของคอนเทนเนอร์ / กระบวนการที่ทำงานอยู่ใน Docker ได้อย่างไร

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

ฉันสามารถเห็น "nginx -g 'daemon ของ" .. ที่นี่ไม่ใช่คำสั่งเต็ม


2
ดูที่นี่เช่นกัน: stackoverflow.com/q/32758793/1747983
Tilo

คำตอบ:


544

docker ps --no-trunc จะแสดงคำสั่งแบบเต็มพร้อมกับรายละเอียดอื่น ๆ ของคอนเทนเนอร์ที่ทำงานอยู่


13
ขอบคุณสิ่งนี้ช่วยได้มาก เพียงแค่หมายเหตุ: '-notrunc' --no-truncเลิกแทนที่ด้วย
โพร

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน มันให้คำสั่งแก่ฉัน แต่ไม่ใช่สวิตช์ทั้งหมด (ซึ่งเป็นสิ่งที่ฉันคิดเมื่อใช้ "คำสั่งเต็ม") คำสั่ง runlike กล่าวถึงลิงค์อื่น ๆ ข้างต้นทำงานได้ดีขึ้นสำหรับฉัน
Dylan Smith

1
สำหรับคำสั่งทั้งหมดของคอนเทนเนอร์ที่รันอยู่เพียงแค่ลบคำสั่งทั้งหมด docker ps --no-trunc
Jacob Morris

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

คำสั่งที่ไม่ถูกตัดทอนอาจมีความยาวมากดูได้เพียง 400 ตัวอักษรแรกเท่านั้นในแต่ละบรรทัดด้วยdocker ps --all --no-trunc|cut -c-400
rubo77

183

ใช้:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... มันเป็น "นักเทียบท่าตรวจสอบ" สำหรับภาชนะทั้งหมด


8
สิ่งนี้ไม่แสดงคำสั่ง docker ps คำสั่ง docker ps สอดคล้องกับ Docker ตรวจสอบ Path และ Args
JDiMatteo

3
ไม่มี bueno ตั้งแต่มกราคม 2018
sg

4
iedocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul

2
หากคุณกำลังเพียงการขว้างปาsudoในด้านหน้าของคำสั่งคุณจะได้รับ"docker inspect" requires at least 1 argument(s).เพราะสายที่สองจะได้รับทั้งหมดของชื่อภาชนะที่คุณอาจจะต้องการที่จะเพิ่ม sudo $(เพียงภายใน
RandomInsano

และสำหรับผู้ที่ต้องการความเข้าใจที่ดีขึ้นของแบบสอบถาม -f ฉันได้พบคำอธิบายที่ดีที่นี่container-solutions.com/docker-inspect-template-magic
intijk

16

ใช้:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

docker psที่จะแสดงเส้นทางคำสั่งและข้อโต้แย้งที่คล้ายกับ


คุณจะแก้ไขสิ่งนี้อย่างไรเพื่อค้นหาคำสั่งเฉพาะเช่นkube-apiserver?
Jonathan

@ Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
RRW

8

ใช้runlikeจาก git repository https://github.com/lavie/runlike

เพื่อติดตั้ง runlike

pip install runlike

เนื่องจากยอมรับรหัสคอนเทนเนอร์เป็นอาร์กิวเมนต์ดังนั้นเพื่อดึงรหัสคอนเทนเนอร์ให้ใช้คำสั่งต่อไปนี้

docker ps -a -q

คุณควรใช้ runlike เพื่อแยกคำสั่ง run docker ที่สมบูรณ์ด้วยคำสั่งต่อไปนี้

runlike <docker container ID>

ใช้งานไม่ได้ แสดง "Command '[' docker ',' inspect ', u'06e6a369f909'] 'ส่งคืนสถานะการออกที่ไม่เป็นศูนย์ 1"
fstang

คุณได้ติดตั้ง runlike ตามที่ฉันพูด
Abhishek Jain

5
ยิ่งไปกว่านั้นคุณสามารถเรียกใช้ runlike ภายในคอนเทนเนอร์ของนักเทียบท่าและหลีกเลี่ยงการติดตั้ง:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith

3

TL-DR

docker ps --no-truncและdocker inspect CONTAINERจัดเตรียม entrypoint ที่ดำเนินการเพื่อเริ่มคอนเทนเนอร์ตามคำสั่งที่ส่งไปยัง แต่อาจพลาดบางส่วนเช่น${ANY_VAR}เนื่องจากตัวแปรสภาวะแวดล้อมคอนเทนเนอร์ไม่ถูกพิมพ์ตามที่ได้รับการแก้ไข

ที่จะเอาชนะนั้นdocker inspect CONTAINERมีความได้เปรียบเพราะมันยังช่วยให้สามารถดึงตัวแปร env แยกต่างหากและค่าของพวกเขาที่กำหนดไว้ในภาชนะจากConfig.Envคุณสมบัติ

docker psและdocker inspectให้ข้อมูลเกี่ยวกับจุดเข้าใช้งานและคำสั่ง บ่อยครั้งที่เป็น wrapper entrypoint script ( .sh) และไม่ใช่โปรแกรม "ของจริง" ที่เริ่มต้นโดยคอนเทนเนอร์ ในการรับข้อมูลเกี่ยวกับสิ่งนั้นขอข้อมูลกระบวนการด้วยpsหรือ/proc/1/cmdlineช่วย


1) docker ps --no-trunc

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

ตัวอย่างเช่นเรียกใช้คอนเทนเนอร์อัลไพน์:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

เมื่อใช้นักเทียบท่า -ps เช่น:

นักเทียบท่า ps -a - ชื่อตัวกรอง = อัลไพน์ตัวอย่าง - no-trunc

มันพิมพ์:

รหัสภาพภาชนะบรรจุคำสั่งสร้างชื่อพอร์ตสถานะ
5b064a6de6d8417 ... อัลไพน์: ล่าสุด "sh -c 'ls $ MY_VAR'" 2 นาทีที่ผ่านมาออกจาก (0) 2 นาทีที่ผ่านมาตัวอย่างอัลไพน์

เราเห็นคำสั่งที่ส่งผ่านไปยังจุดเข้าใช้งานsh -c 'ls $MY_VAR'แต่$MY_VAR ไม่สามารถแก้ไขได้

2) docker inspect CONTAINER

เมื่อเราตรวจสอบคอนเทนเนอร์อัลไพน์ตัวอย่าง:

docker inspect alpine-example | grep -4 Cmd

คำสั่งนั้นอยู่ที่นั่น แต่เรายังไม่เห็นค่าตัวแปร env:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

ในความเป็นจริงเราไม่สามารถเห็นตัวแปรสอดแทรกด้วยคำสั่งนักเทียบท่าเหล่านี้
ในขณะที่เป็นการแลกเปลี่ยนเราสามารถแสดงทั้งคำสั่งและตัวแปร env สำหรับคอนเทนเนอร์ที่มีการตรวจสอบนักเทียบท่า:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

ภาพพิมพ์นั้น:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

วิธีที่นักเทียบท่ามากขึ้นคือการใช้--formatแฟล็กของdocker inspectที่อนุญาตให้ระบุแอ็ตทริบิวต์ JSON เพื่อแสดงผล:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

ผลลัพธ์นั้น:

/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]

3) ดึงข้อมูลกระบวนการที่เริ่มต้นจากตัวคอนเทนเนอร์เพื่อเรียกใช้คอนเทนเนอร์

จุดเข้าใช้งานและคำสั่งที่เรียกใช้งานโดยนักเทียบท่าอาจเป็นประโยชน์ แต่ในบางกรณีมันไม่เพียงพอเพราะนั่นเป็น "สคริปต์" wrapper entrypoint ( .sh) ที่รับผิดชอบในการเริ่มกระบวนการจริง / แกน
ตัวอย่างเช่นเมื่อใช้ภาชนะ Nexus "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"คำสั่งดำเนินการและการแสดงเพื่อเรียกใช้ภาชนะที่เป็น
สำหรับ PostgreSQL "docker-entrypoint.sh postgres"ที่เป็น

docker exec CONTAINER ps auxหากต้องการข้อมูลเพิ่มเติมเราสามารถดำเนินการเกี่ยวกับภาชนะที่ทำงาน
มันอาจพิมพ์กระบวนการอื่น ๆ ที่อาจไม่สนใจเรา
ในการ จำกัด กระบวนการเริ่มต้นที่เปิดโดย entrypoint เราสามารถทำ:

docker exec CONTAINER ps -1

ฉันระบุ1เพราะกระบวนการที่ดำเนินการโดยจุดเข้าใช้งานนั้นโดยทั่วไปเป็นกระบวนการที่มี1ID

หากไม่มีpsเรายังคงสามารถค้นหาข้อมูลใน/proc/1/cmdline(ใน Linux distros ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด) ตัวอย่างเช่น :

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

หากเรามีการเข้าถึงโฮสต์นักเทียบท่าที่เริ่มต้นคอนเทนเนอร์ทางเลือกอื่นเพื่อรับคำสั่งทั้งหมดของกระบวนการที่ดำเนินการโดยจุดเข้าใช้งานคือ:: execute ps -PIDโดย PID เป็นกระบวนการโลคัลที่สร้างโดย Docker daemon เพื่อเรียกใช้คอนเทนเนอร์เช่น:

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

การจัดรูปแบบที่ใช้งานง่ายด้วย ps docker

docker ps --no-truncไม่ใช่เรื่องง่ายที่จะอ่าน
การระบุคอลัมน์ที่จะพิมพ์และในรูปแบบตารางอาจทำให้ดีขึ้น:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

สร้างนามแฝงอาจช่วยได้:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'

2

การย้ายความคิดเห็นของดีแลนไปเป็นคำตอบที่เต็มไปด้วยความคิดเพราะเกินไปที่มีประโยชน์:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

มันทำอะไร? รันhttps://github.com/lavie/runlikeภายในคอนเทนเนอร์รับคำสั่ง run docker ที่สมบูรณ์จากนั้นลบคอนเทนเนอร์สำหรับคุณ

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