วิธีการตรวจสอบกระบวนการหลักที่เสียชีวิตในตู้เทียบท่า?


13

บางครั้งคุณต้องตรวจสอบภาชนะบรรจุซึ่งหยุดทำงานหรือภาชนะบรรจุซึ่งหลังจากการเริ่มต้นการตายอย่างรวดเร็วและหยุดลง

docker exec -ti <id> bash ใช้งานได้กับการเรียกใช้คอนเทนเนอร์เท่านั้นเมื่อเสร็จสิ้นพรอมต์ bash จะสิ้นสุดลงเช่นกัน

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

เราสามารถทำได้docker commitแล้วdocker runในภาพใหม่ด้วยคำสั่งที่แตกต่างกัน แต่ฉันสงสัยว่ามีทางเลือกอื่น ๆ

หมายเหตุ : docker logsเพียงแค่คืนสิ่งที่แอพพลิเคชั่นพิมพ์ไปยัง stdout / stderr นั่นอาจไม่เพียงพอที่จะคิดออกว่าปัญหาคืออะไร


หลังจากที่ในขณะที่คิดเกี่ยวกับมัน: กระบวนการหลักเทียบท่า? ในฐานะที่เป็นคอนเทนเนอร์มุ่งทำงานเพียงหนึ่งกระบวนการคำว่า 'main' จะถูกลบออกหรือคุณกำลังทำอะไรแปลก ๆ (เช่นเรียกใช้กระบวนการ init) หรือคุณกำลังใช้เธรดเป็นกระบวนการ ... ฉันถือว่ามันเป็น ตัวเลือกที่หนึ่ง แต่ฉันต้องบอกว่าเพราะมันรบกวนจิตใจฉัน
Tensibai

@Tensibai บางครั้งคุณต้องเรียกใช้บางสิ่งบางอย่างเช่น dumb-init เพื่อจัดการปัญหา pid 1 / การส่งสัญญาณในคอนเทนเนอร์ถ้าคำสั่งหลักของคุณไม่สามารถจัดการได้ อาจมีบางกรณีที่ตัวเชื่อมต่อคอนเทนเนอร์ทำงานมากกว่าหนึ่งกระบวนการ
SztupY

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

คำตอบ:


9

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

คุณสามารถสร้างสิ่งDockerfileที่มีลักษณะดังนี้:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

docker run debug_version strace original_cmdจากนั้นเรียกภาพใหม่ของคุณโดยใช้

สำหรับกระบวนการที่แยกเด็ก (และจากนั้นตาย) คุณต้องการเรียกใช้straceด้วย-ffตัวเลือก คุณสามารถแมปไฟล์บางไฟล์โดยใช้ปริมาณข้อมูล Dockerและใช้-oตัวเลือกจากstraceเพื่อเขียนลงไป แต่โดยทั่วไปstraceจะออกจากการส่งออกใน stdout docker logซึ่งสามารถอ่านได้โดยใช้

คำถามที่เกี่ยวข้อง: กระบวนการ Linux สิ้นสุดลงอย่างลึกลับ


ซึ่งหมายความว่าฉันยังคงต้องdocker commitหยุดภาชนะของฉันก่อนที่จะมีภาพที่จะเริ่มต้น
SztupY

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

นั่นเป็นเพียงหนึ่งในสถานการณ์ที่จะได้รับภาชนะที่หยุด
SztupY

นอกจากนี้ยังมีแพคเกจสำหรับstraceในอัลไพน์ลินุกซ์pkgs.alpinelinux.org/package/edge/main/x86_64/strace apk install straceใช้แพคเกจผู้จัดการอัลไพน์ที่จะติดตั้ง
Evgeny

3

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

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

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

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