این نوشته پیرامون راه کاری ساده، مفید، کاربردی اما خطرناک برای خالی کردن فضای دیسک پر شده با
image های کانتینرها می باشد.

مقدمه
البته پر شدن فضا دیسک روی سرور registry برای docker یا حتی harbor طبیعی است. با توجه به
ذات این سرویس که برای نگهداری image های container استفاده می شود، انتظار می رود تا فضای دیسک
سرور مدنظر به مرور افزایش و پر شود.
همچنین خود سرویس برای حفظ فضای دیسک و جلوی گیری از این مورد، از مکانیزم Garbeg Collection
یا GC بهره می برد که، طی زمانبندی انجام شده، این مکانیزم شروع به حذف و لایه های آزاد و رها شده
image ها کرده و مقداری از فضای دیسک را خالی میکند.
چالش
حال چالش اینجا بود که لایه هایی از image ها بنا به مشکلاتی، توسط GC حذف نشده و به مرور موجب
افزایش فضای دیسک و پر شدن آن می شود.
لایه های imageها را اصطلاحا blob می نامند. این بلاب ها مسیر یک پشه هستند که به صورت هش نام گزاری
شده اند. این نام ها در دیتابیس برنامه ها جانبی registry مثل harbor نگهداری می شوند.
در نهایت مکانیزم GC روی همین بلاب ها اجرا شده و بلاپ ها را حذف می کند. حال زمانی که GC در
دیتابیس خود بلابی را منتخب برای حذف پیدا نکند، از آن چشم پوشی کرده، به عبارت دیگر از این قبیل
پوشه های بلاب از دست رفته - یتیم یا orphan یاد می شود، که عملا GC کاری با آنها نداشته و آن ها را
حذف نمی کند. بنابراین به مرور زمان این نوع blob ها افزایش یافته و فضای دیسک را پر می کنند.
راهکار
طی بررسی هایی که انجام دادم، برای این مشکل راهکار قطعی ای پیدا نکردم، پس به ناچار راهکاری که
به ذهن می رسید این بود که از دیتابیس خود harbor استفاده کرده. این برنامه هش بلاب ها را در جداول
خود نگهداری می کند. پس می توان با یک کوئری ساده آدرس blob های مورد استفاده را به دست آورد و
آدرس پوشه های بلابی که در آن کوئری نبود را می توان به عنوان پوشه بلاب های یتیم یا orphan در نظر
گرفت و حذف نمود.
در عمل
با اجرا کد bash script
removeOrphanBlobs
می توان این پوشه های یتیم را حذف کنید. مکانیزم عملکرد به این صورت
است که، مسیر پوشه بلاب ها که به صورت زیر می باشد را گرفته، زیر پوشه هایی که حاوی همان هش ها می باشند
را بررسی کرده و در صورتی که نام پوشه در دیتابیس نباشد، آن پوشه را حذف می کند
/storage/registry/docker/registry/v2/blobs/sha256/
نحوه اجرا
نحوه اجرای اسکریپت به صورت زیر می باشد:
./checkBlobs.sh 2a
اجرای این اسکریپت بسته به حجم پوشه registry می تواند متفاوت باشد، نکته مهم این که
با اجرای این اسکریپت سرویس می تواند به خدمت خود ادامه دهد و خللی در روند کارش پیش نخواهد آمد
در پایان
مجدد تأکید می کنم این اسکرپیت لزوما تضمین حذف نیست و تا ۱۰٪ خطا نیز می توان برای آن پیش بینی کرد.
امیدوارم که با این اسکریپت مشکل فضای دیسک سرور تون رفع شود.