عامل الميناء التسجيل الخاص-حذف جميع الصور ، ولكن لا تزال تظهر في الكتالوج

بعد الوثائق الرسمية (https://docs.docker.com/registry/spec/api/#deleting-an-image) لقد تمكنت من حذف صورة بنجاح. كما هو متوقع ، بعد الحذف ، لم يعد من الممكن سحب الصورة أو استدعاء بيانها عبر واجهة برمجة التطبيقات.

أشعر أنني قد حصلت على الجزء الصعب القيام به, ومع ذلك ، فإن المشكلة هي أن الريبو لا يزال مدرجا تحت /v2/_catalog بعد الانتهاء من الحذف. أحاول تطهير السجل بالكامل.

هنا هو ملف إنشاء السجل الخاص بي:

registry:  image: registry:2.5.2  container_name: registry-test  ports:    - 5007:5000  environment:    REGISTRY_STORAGE: s3    REGISTRY_HTTP_TLS_CERTIFICATE: /etc/cert.crt    REGISTRY_HTTP_TLS_KEY: /etc/cert.key    REGISTRY_STORAGE_S3_ACCESSKEY: ******    REGISTRY_STORAGE_S3_SECRETKEY: ******    REGISTRY_STORAGE_S3_REGION: us-west-1    REGISTRY_STORAGE_S3_BUCKET: ******    REGISTRY_STORAGE_S3_SECURE: "true"    REGISTRY_STORAGE_DELETE_ENABLED: "true"  volumes:    - /dockerdata/volumes/registry-test/etc/cert.crt:/etc/cert.crt    - /dockerdata/volumes/registry-test/etc/cert.key:/etc/cert.key  restart: unless-stopped

هنا هو الأسلوب رفيع المستوى على ما فعلته لحذف الصورة:

  1. جمع ملخص الصورة: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag مع "Accept: application/vnd.docker.distribution.manifest.v2+json" تضاف إلى رأس على المكالمة

  2. مفتاح رأس إرجاع المكالمة Docker-Content-Digest مع قيمة مثل sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. باستخدام هذه القيمة من الخطوة 2 ، قم بتشغيل استدعاء الحذف: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. إرجاع واجهة برمجة تطبيقات التسجيل 202 Accepted

  5. تشغيل جمع القمامة يدويا: registry garbage-collect /etc/docker/registry/config.yml

  6. جامع القمامة حذف النقط المرتبطة من القرص (سجل حذف هنا ، لكنه حذف بنجاح النقط)

في هذه المرحلة ، يمكنني تأكيد حذف النقط تماما من القرص ولم يعد بإمكاني الاتصال بتفاصيل الصورة (كما في الخطوة 1 أعلاه) حتى ظننت أنني قد فعلت.

ومع ذلك ، عند تشغيل: /v2/_catalog لا يزال الريبو المرتبط بي يسرد (على الرغم من عدم وجود صور بداخله)! من الواضح أنه لا يمكن سحبها أو استخدامها ، ولكن كيف يمكنني إزالة هذا الريبو بالكامل من تلك القائمة الآن لأنه لا يحتوي على صور مرتبطة به?

لا أرى في أي مكان كيف صحيح قم بإزالة هذا من صفحة وثائق واجهة برمجة التطبيقات. ربما أنا في عداد المفقودين في مكان ما?

تحرير -

كنت أرغب في إضافة المزيد من المعلومات حول كيفية ظهور السجل قبل وبعد حدوث الحذف أعلاه.

قبل عملية الحذف أعلاه:

docker/registry/v2/repositories/myimage/_manifests/revisions/...docker/registry/v2/repositories/myimage/_manifests/tags/... docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)docker/registry/v2/blobs/sha256/...

بعد عملية الحذف أعلاه:

docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)

لذا فإن الشيء الوحيد المتبقي هو _layers الدليل مع نفس 5س طبقات المدرجة. ويبدو أن هذا هو السبب في انها لا تزال مدرجة على _catalog

عندما أحذف myimage مجلد (من docker/registry/v2/repositories/myimage) ثم لم يعد يظهر المستودع في _catalog

يبدو أن هذه طريقة لتطهيرها من _catalog قائمة. ومع ذلك-ماذا لو كانت الصورة تحتوي على علامات 2 ، ولكن تم حذف 1 فقط-هل هناك سبب لحذف أي شيء من _layers في هذه الحالة? كيف يمكن التعامل مع ذلك بإصدارات متعددة من الصورة? من الواضح أنني لا يمكن أن مجرد قضم _layers الدليل كطريقة نهائية لأنه ، في العالم الحقيقي ، سيكون هناك العديد من الإصدارات الموسومة للصورة. لذلك يجب القيام بذلك بذكاء.

أنا ببساطة أجد صعوبة في العثور على أي وثائق حول صيانة / صيانة سجل عامل الإرساء ولا المخطط الخاص بـ _layers الدليل الفرعي ولماذا جامع القمامة لا تنظيف هذا الدليل نفسه يفعل مع البيانات والنقط.

بعد الكثير من البحث ، لا توجد طريقة حالية لإزالة إدخالات الكتالوج بالكامل عبر واجهة برمجة التطبيقات فقط.

لا يسمح سجل الإصدار 2 بحذف علامات معينة فقط من صورة

وهذا يعني أن الصورة بأكملها يتم حذف. حذف العلامات في العلاقات العامة المفتوحة لإصدار مستقبلي من التسجيل (https://github.com/docker/distribution/pull/2169)

ماذا يعني هذا فيما يتعلق بهذا السؤال هو أن الطريقة الصحيحة هي حذف الصورة من قائمة الريبو تماما كما افترضت. إزالته من القرص. (مثل rm -r v2/repositories/myimage أين myimage هو اسم الصورة الذي قمت بحذفه عبر واجهة برمجة التطبيقات.)

ثم سيتم إزالته من قائمة الريبو في _catalog والانتهاء من عملية الحذف الخاصة بك. ليست هناك حاجة لإعادة تشغيل أي شيء مثل إجابة أخرى المذكورة.

عند إضافة القدرة على حذف علامات محددة من السجل ، سيتغير هذا الإجراء. الآن كل شيء أو لا شيء.

المرجع:

https://forums.docker.com/t/delete-repository-from-v2-private-registry/16767/5

https://github.com/docker/distribution/pull/2169

https://docs.docker.com/registry/spec/api/