Backgroud
Nguyên nhân cho vấn đề có thể được chia ra giữa việc chúng tôi định cấu hình sai các khối lượng vùng chứa và sự cố do docker làm rò rỉ (không phát hành) dữ liệu tạm thời được ghi vào các khối lượng này. Chúng ta nên ánh xạ (tới các thư mục lưu trữ hoặc các yêu cầu lưu trữ liên tục khác) tất cả các thư mục tạm thời / nhật ký / đầu của vùng chứa nơi ứng dụng của chúng ta ghi thường xuyên và / hoặc nhiều. Docker không chịu trách nhiệm về việc dọn dẹp tất cả cái gọi là EmptyDirs được tạo tự động nằm trong mặc định /var/lib/docker/overlay2/*/diff/*
. Nội dung của các thư mục "không liên tục" này sẽ được docker tự động xóa sau khi vùng chứa bị dừng, nhưng rõ ràng là không (thậm chí không thể xóa chúng khỏi phía máy chủ nếu vùng chứa vẫn đang chạy - và nó có thể chạy trong nhiều tháng tại một thời điểm).
Cách giải quyết
Một giải pháp thay thế yêu cầu dọn dẹp thủ công cẩn thận và mặc dù đã được mô tả ở những nơi khác, bạn vẫn có thể tìm thấy một số gợi ý từ nghiên cứu điển hình của tôi, mà tôi đã cố gắng đưa ra hướng dẫn và tổng quát nhất có thể.
Vì vậy, những gì đã xảy ra là ứng dụng thủ phạm (trong trường hợp của tôi clair-scanner
) đã quản lý để ghi hàng trăm hợp đồng dữ liệu trong vài tháng vào /diff/tmp
thư mục con của dockeroverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Vì vậy, vì tất cả các thư mục con /diff/tmp
đó đều khá dễ hiểu (tất cả đều có dạng clair-scanner-*
và có ngày tạo lỗi thời), tôi đã dừng vùng chứa được liên kết ( docker stop clair
) và cẩn thận loại bỏ các thư mục con lỗi thời này diff/tmp
, bắt đầu cẩn thận với một (cũ nhất) duy nhất, và kiểm tra tác động trên công cụ docker (yêu cầu khởi động lại [ systemctl restart docker
] để lấy lại dung lượng đĩa):
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)
Tôi đã lấy lại hàng trăm hợp đồng biểu diễn dung lượng đĩa mà không cần phải cài đặt lại docker hoặc xóa toàn bộ các thư mục của nó. Tất cả các vùng chứa đang chạy phải dừng lại tại một điểm, vì cần khởi động lại trình nền docker để lấy lại dung lượng đĩa, vì vậy trước tiên hãy đảm bảo rằng các vùng chứa chuyển đổi dự phòng của bạn đang chạy chính xác trên một / nút / s). Mặc dù vậy, tôi ước rằng docker prune
lệnh cũng có thể bao gồm dữ liệu đã lỗi thời /diff/tmp
(hoặc thậm chí /diff/*
) (thông qua một công tắc khác).
Đây là một vấn đề đã 3 năm tuổi, bạn có thể đọc lịch sử phong phú và đầy màu sắc của nó trên các diễn đàn Docker, nơi một biến thể nhằm vào nhật ký ứng dụng của giải pháp trên đã được đề xuất vào năm 2019 và dường như đã hoạt động trong một số thiết lập: https: // Forum.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604