डॉकर निजी रजिस्ट्री-सभी छवियों को हटा दिया, लेकिन फिर भी कैटलॉग में दिखा रहा है

आधिकारिक दस्तावेज के बाद (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/