พื้นหลัง
ข้อตำหนิสำหรับปัญหานี้สามารถแบ่งออกได้ระหว่างการกำหนดค่าปริมาณคอนเทนเนอร์ที่ไม่ถูกต้องและปัญหาเกี่ยวกับนักเทียบท่าที่รั่วไหล (ไม่สามารถปล่อย) ข้อมูลชั่วคราวที่เขียนลงในไดรฟ์ข้อมูลเหล่านี้ เราควรทำแผนที่ (ไม่ว่าจะเป็นโฮสต์โฟลเดอร์หรือการอ้างสิทธิ์พื้นที่เก็บข้อมูลถาวรอื่น ๆ ) โฟลเดอร์ชั่วคราว / บันทึก / รอยขีดข่วนของคอนเทนเนอร์ทั้งหมดที่แอปของเราเขียนบ่อยและ / หรือหนักมาก นักเทียบท่าไม่รับผิดชอบต่อการล้างข้อมูลทั้งหมดที่สร้างขึ้นโดยอัตโนมัติที่เรียกว่า EmptyDirs ซึ่งอยู่ตามค่าเริ่มต้นใน/var/lib/docker/overlay2/*/diff/*
. เนื้อหาของโฟลเดอร์ที่ "ไม่ถาวร" เหล่านี้ควรถูกล้างโดยอัตโนมัติโดยนักเทียบท่าหลังจากที่คอนเทนเนอร์หยุดทำงาน แต่ดูเหมือนว่าจะไม่ใช่ (อาจเป็นไปไม่ได้ที่จะล้างออกจากฝั่งโฮสต์หากคอนเทนเนอร์ยังคงทำงานอยู่ - และสามารถทำงานได้เป็นเวลาหลายเดือน ขณะนั้น).
วิธีแก้ปัญหา
วิธีแก้ปัญหาต้องใช้การล้างข้อมูลด้วยตนเองอย่างรอบคอบและในขณะที่อธิบายไว้แล้วในที่อื่นคุณอาจพบคำแนะนำบางอย่างจากกรณีศึกษาของฉันซึ่งฉันพยายามทำให้เป็นคำแนะนำและเข้าใจได้โดยทั่วไปมากที่สุด
สิ่งที่เกิดขึ้นคือแอปผู้ร้าย (ในกรณีของฉันclair-scanner
) สามารถเขียนข้อมูลหลายร้อยกิ๊กในช่วงสองสามเดือนไปยัง/diff/tmp
โฟลเดอร์ย่อยของนักเทียบท่าoverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
ดังนั้นเนื่องจากโฟลเดอร์ย่อยเหล่านี้ทั้งหมดใน/diff/tmp
นั้นค่อนข้างอธิบายตัวเองได้ดี (ทั้งหมดอยู่ในรูปแบบclair-scanner-*
และมีวันที่สร้างที่ล้าสมัย) ฉันจึงหยุดคอนเทนเนอร์ที่เกี่ยวข้อง ( docker stop clair
) และลบโฟลเดอร์ย่อยที่ล้าสมัยเหล่านี้ออกอย่างระมัดระวังdiff/tmp
โดยเริ่มต้นอย่างรอบคอบด้วยโฟลเดอร์เดียว (เก่าที่สุด) และ การทดสอบผลกระทบต่อ Docker Engine (ซึ่งต้องรีสตาร์ท [ systemctl restart docker
] เพื่อเรียกคืนพื้นที่ดิสก์):
rm -rf $(ls -at /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp | grep clair-scanner | tail -1)
ฉันเรียกคืนพื้นที่ดิสก์หลายร้อยกิ๊กโดยไม่จำเป็นต้องติดตั้งนักเทียบท่าใหม่หรือล้างโฟลเดอร์ทั้งหมด คอนเทนเนอร์ที่กำลังรันทั้งหมดต้องหยุดทำงานในจุดเดียวเนื่องจากต้องรีสตาร์ท Docker daemon เพื่อเรียกคืนพื้นที่ดิสก์ดังนั้นโปรดตรวจสอบให้แน่ใจก่อนอื่นคอนเทนเนอร์เฟลโอเวอร์ของคุณกำลังรันอย่างถูกต้องบน / other node / s) ฉันหวังว่าdocker prune
คำสั่งจะครอบคลุมข้อมูลที่ล้าสมัย/diff/tmp
(หรือแม้กระทั่ง/diff/*
) ด้วย (ผ่านสวิตช์อื่น)
ตอนนี้เป็นปัญหาอายุ 3 ปีคุณสามารถอ่านประวัติอันยาวนานและมีสีสันได้ในฟอรัม Docker ซึ่งมีการเสนอตัวแปรที่มุ่งเป้าไปที่บันทึกแอปพลิเคชันของโซลูชันข้างต้นในปี 2019 และดูเหมือนว่าจะทำงานในการตั้งค่าหลายอย่าง: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604