निजी डॉकटर रजिस्ट्री से छवियों को कैसे हटाएं?


163

मैं एक निजी डॉकटर रजिस्ट्री चलाता हूं, और मैं सभी छवियों को हटाना चाहता हूं लेकिन latestभंडार से। मैं संपूर्ण रिपॉजिटरी को हटाना नहीं चाहता, बस इसके अंदर की कुछ छवियां। एपीआई डॉक्स यह करने के लिए एक तरह से उल्लेख नहीं है, लेकिन निश्चित रूप से यह संभव है?


2
स्वीकृत उत्तर अब सही नहीं है (हालाँकि निश्चित रूप से बहुत अच्छा है)। आप DELETE / v2 / <नाम> / मैनिफ़ेस्ट / <संदर्भ>: docs.docker.com/registry/spec/api/#de हटाना-an
Michael Zelensky

जवाबों:


116

वर्तमान में आप उस कार्य के लिए रजिस्ट्री एपीआई का उपयोग नहीं कर सकते हैं। यह आपको केवल एक रिपॉजिटरी या एक विशिष्ट टैग को हटाने की अनुमति देता है।

सामान्य तौर पर, रिपॉजिटरी को हटाने का अर्थ है, कि इस रेपो से जुड़े सभी टैग हटा दिए गए हैं।

किसी टैग को हटाने का अर्थ है, कि एक छवि और एक टैग के बीच का संबंध हटा दिया गया है।

उपरोक्त में से कोई भी एकल छवि नहीं हटाएगा। उन्हें आपकी डिस्क पर छोड़ दिया जाता है।


वैकल्पिक हल

इस वर्कअराउंड के लिए आपको अपने docker की छवियों को स्थानीय स्तर पर संग्रहित करना होगा।

आपके समाधान के लिए वर्कअराउंड सभी लेकिन नवीनतम टैग को हटाना होगा और इस तरह संबंधित छवियों के संदर्भ को संभावित रूप से हटा देगा। फिर आप इस स्क्रिप्ट को सभी छवियों को हटाने के लिए चला सकते हैं , जो किसी भी टैग या किसी भी उपयोग की गई छवि के वंश द्वारा संदर्भित नहीं हैं।

शब्दावली (चित्र और टैग)

इस तरह से एक छवि ग्राफ पर विचार करें जहां पूंजी अक्षर ( A, B...,) लघु छवि आईडी का प्रतिनिधित्व करते हैं और <-इसका मतलब है कि एक छवि दूसरी छवि पर आधारित है:

 A <- B <- C <- D

अब हम चित्र में टैग जोड़ते हैं:

 A <- B <- C <- D
           |    |
           |    <version2>
           <version1>

यहां, टैग <version1>छवि का संदर्भ देता है Cऔर टैग <version2>छवि का संदर्भ देता है D

अपने प्रश्न को परिष्कृत करना

अपने प्रश्न में आपने कहा था कि आप हटाना चाहते थे

सभी चित्र लेकिन latest

। अब, यह शब्दावली बिल्कुल सही नहीं है। आपने मिश्रित चित्र और टैग लगाए हैं। ग्राफ़ को देखकर मुझे लगता है कि आप सहमत होंगे कि टैग <version2>नवीनतम संस्करण का प्रतिनिधित्व करता है। वास्तव में, इस प्रश्न के अनुसार आपके पास एक टैग हो सकता है जो नवीनतम संस्करण का प्रतिनिधित्व करता है:

 A <- B <- C <- D
           |    |
           |    <version2>
           |    <latest>
           <version1>

चूंकि <latest>टैग संदर्भ छवि Dमैं आपसे पूछता हूं: क्या आप वास्तव में सभी लेकिन छवि को हटाना चाहते हैं D? शायद ऩही!

यदि आप कोई टैग हटाते हैं तो क्या होता है?

यदि आप <version1>डॉकर रीस्ट एपीआई का उपयोग करके टैग हटाते हैं, तो आपको यह मिलेगा:

 A <- B <- C <- D
                |
                <version2>
                <latest>

याद रखें: डॉकर एक छवि को कभी नहीं हटाएगा! अगर ऐसा किया है, तो भी इस मामले में यह एक छवि को नष्ट नहीं कर सकता, क्योंकि छवि उस छवि Cके लिए वंश का हिस्सा है Dजिसे टैग किया गया है।

यहां तक ​​कि अगर आप इस स्क्रिप्ट का उपयोग करते हैं , तो कोई भी छवि नहीं हटाई जाएगी।

जब एक छवि को हटाया जा सकता है

इस शर्त के तहत कि आप नियंत्रित कर सकते हैं जब कोई आपकी रजिस्ट्री को खींच सकता है या धकेल सकता है (जैसे कि REST इंटरफ़ेस को अक्षम करके)। यदि आप किसी अन्य छवि पर आधारित नहीं हैं और कोई भी टैग संदर्भित नहीं करता है, तो आप एक छवि ग्राफ से एक छवि को हटा सकते हैं।

ध्यान दें कि निम्नलिखित ग्राफ में, छवि Dहै नहीं के आधार पर Cलेकिन पर B। इसलिए, Dपर निर्भर नहीं करता है C। यदि आप <version1>इस ग्राफ़ में टैग हटाते हैं , तो छवि Cकिसी भी छवि द्वारा उपयोग नहीं की जाएगी और यह स्क्रिप्ट इसे हटा सकती है।

 A <- B <--------- D
      \            |
       \           <version2>
        \          <latest>
         \ <- C
              |
              <version1>

सफाई के बाद आपकी छवि का ग्राफ़ इस तरह दिखता है:

 A <- B <- D
           |
           <version2>
           <latest>

क्या ये वही है जो तुम चाहते हो?


आप सही हैं - टैग को हटाना वास्तव में संबंधित छवियों को हटाना नहीं था। क्या बॉक्स में ssh एक्सेस दी गई छवियों को हटाने का कोई तरीका है, फिर?
सिंह

1
मैंने अपना जवाब एक वर्कअराउंड के साथ संपादित किया है जो मेरे लिए काम करता है। मुझे उम्मीद है यह मदद करेगा।
कोनराड क्लेइन

ठीक यही है - मैं समझता हूं कि चित्र वृद्धिशील रूप से बनाए गए हैं, लेकिन मुझे उन मृत शाखाओं को आगे बढ़ाने का एक तरीका चाहिए। धन्यवाद!
सिंह

@KonradKleine आप रजिस्ट्री से प्राप्त छवियों की सूची से छवियों का ग्राफ़ कैसे बनाते हैं?
राफेल बैरोस

9
कचरा संग्रहण आखिरकार रजिस्ट्री v2.4.0 docs.docker.com/registry/gar कचरा-
मार्कस लिंडबर्ग

68

मैंने अपनी रजिस्ट्री के साथ एक ही समस्या का सामना किया है, तो मैंने ब्लॉग पेज से नीचे सूचीबद्ध समाधान की कोशिश की। यह काम करता हैं।

चरण 1: सूचीबद्ध कैटलॉग

आप इस url पर कॉल करके अपने कैटलॉग सूचीबद्ध कर सकते हैं:

http://YourPrivateRegistyIP:5000/v2/_catalog

प्रतिक्रिया निम्न प्रारूप में होगी:

{
  "repositories": [
    <name>,
    ...
  ]
}

चरण 2: संबंधित कैटलॉग के लिए टैगिंग सूची

आप इस url पर कॉल करके अपनी सूची के टैग सूचीबद्ध कर सकते हैं:

http://YourPrivateRegistyIP:5000/v2/<name>/tags/list

प्रतिक्रिया निम्न प्रारूप में होगी:

{
"name": <name>,
"tags": [
    <tag>,
    ...
]

}

चरण 3: संबंधित टैग के लिए सूची प्रकट मूल्य

आप इस आदेश को docker रजिस्ट्री कंटेनर में चला सकते हैं:

curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'

प्रतिक्रिया निम्न प्रारूप में होगी:

sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073

प्रकट मूल्य के साथ नीचे दी गई कमांड चलाएँ:

curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://127.0.0.1:5000/v2/<name>/manifests/sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073

चरण 4: चिह्नित अभिव्यक्तियों को हटाएं

इस आदेश को अपने docker registy कंटेनर में चलाएँ:

bin/registry garbage-collect  /etc/docker/registry/config.yml  

यहाँ मेरा config.yml है

root@c695814325f4:/etc# cat /etc/docker/registry/config.yml
version: 0.1
log:
  fields:
  service: registry
storage:
    cache:
        blobdescriptor: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
    delete:
        enabled: true
http:
    addr: :5000
    headers:
        X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

आदेश सफल हुए, जिसमें " Deleteing blob: /docker/..." के बारे में संदेश भी शामिल थे लेकिन यह डिस्क स्थान का उपयोग नहीं करता था। बिन / रजिस्ट्री github.com/docker/distribution v2.4.1 का उपयोग करना ।
JamesThomasMoon1979

3
एक छवि को हटाने के लिए, आपको रजिस्ट्री कंटेनर को REGISTRY_STORAGE_DELETE_ENABLED = अन्य पैरामीटर के साथ चलाना चाहिए।
आदिल

3
मैंने /etc/docker/registry/config.yml फ़ाइल में "हटाएं: सक्षम" मान को सही पर सेट किया है। इस कॉन्फ़िगरेशन के लिए REGISTRY_STORAGE_DELETE_ENABLED चर @AdilIlhan
Yavuz Sert

पुन: चरण 3, "डोकर-सामग्री-डाइजेस्ट" हेडर में होना चाहिए? (इसे कर्ल आउटपुट में नहीं देखना)। क्या मुझे यह जानने के लिए कि मैं सफलतापूर्वक इसे चिह्नित करने के लिए चिह्नित प्रकट (एस) को हटाने से पहले एक प्रकट अंकन के परिणाम देखने में सक्षम होना चाहिए? ऐसा लगता है कि मुझे जो भी भेजा गया है, वह मुझे कोई प्रतिक्रिया नहीं दे रहा है।
21

Docker-Content-Digestभाग लोअरकेस (डोकर इंजन v18.09.2 पर परीक्षण) यानी में होना चाहिएcurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
मुहम्मद अब्दुर्रहमान

63

वर्तमान v2रजिस्ट्री अब के माध्यम से हटाने का समर्थन करती हैDELETE /v2/<name>/manifests/<reference>

देखें: https://github.com/docker/distribution/blob/master/docs/spec/api.md#de हटाना-an-image

काम का उपयोग: https://github.com/byrnedo/docker-reg-tool

संपादित करें: <reference>ऊपर प्रकट अनुरोध को प्राप्त करने से पुनर्प्राप्त किया जा सकता है

GET /v2/<name>/manifests/<tag>

और Docker-Content-Digestप्रतिक्रिया में हेडर की जाँच करना ।

संपादन 2: आपको निम्नलिखित एनवी सेट के साथ अपनी रजिस्ट्री चलानी पड़ सकती है:

REGISTRY_STORAGE_DELETE_ENABLED="true"

Edit3: इस डिस्क स्थान को मुक्त करने के लिए आपको कचरा संग्रह चलाना पड़ सकता है: https://docs.docker.com/registry/gar कचरा-colorion /


3
यहाँ कुछ अन्य उत्तर दिखाते हैं कि कैसे प्रकट संदर्भ हैश को निकालना है। पास होने के लिए किसी टैग को अनुवाद करने के लिए यह आवश्यक है DELETE
JamesThomasMoon1979

असमर्थित त्रुटि हो रही है। मैंने संदर्भ के रूप में उचित पाचन मूल्य दिया है।
विंस्टर

1
@ JamesThomasMoon1979 ने संदर्भ हैश प्राप्त करने के निर्देशों के साथ अद्यतन किया।
byrnedo

11
V2 पर भी और त्रुटि हो रही है{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
गडेलकेरेम

1
@ गाडलकेरेम
ब्रेडो जू

17

समस्या 1

आपने उल्लेख किया कि यह आपकी निजी डॉकटर रजिस्ट्री थी, इसलिए आपको हब रजिस्ट्री एपीआई डॉक के बजाय रजिस्ट्री एपीआई की जांच करने की आवश्यकता है , जो आपके द्वारा प्रदान की गई लिंक है।

समस्या २

docker रजिस्ट्री एपीआई एक क्लाइंट / सर्वर प्रोटोकॉल है, यह सर्वर के कार्यान्वयन पर निर्भर है कि बैक-एंड में छवियों को हटा दें या नहीं। (मेरा अनुमान)

DELETE /v1/repositories/(namespace)/(repository)/tags/(tag*)

विस्तार से जानकारी

नीचे मैंने डेमो दिया कि यह आपके विवरण से अब कैसे काम करता है जैसे कि आपके प्रश्नों के लिए मेरी समझ।

आप चलाते हैं आप निजी डॉकटर रजिस्ट्री चलाते हैं, मैं डिफ़ॉल्ट का उपयोग करता हूं और 5000पोर्ट में सुनता हूं

docker run -d -p 5000:5000 registry

फिर मैं स्थानीय छवि को टैग करता हूं और उसमें धक्का देता हूं।

$ docker tag ubuntu localhost:5000/ubuntu
$ docker push localhost:5000/ubuntu
The push refers to a repository [localhost:5000/ubuntu] (len: 1)
Sending image list
Pushing repository localhost:5000/ubuntu (1 tags)
511136ea3c5a: Image successfully pushed
d7ac5e4f1812: Image successfully pushed
2f4b4d6a4a06: Image successfully pushed
83ff768040a0: Image successfully pushed
6c37f792ddac: Image successfully pushed
e54ca5efa2e9: Image successfully pushed
Pushing tag for rev [e54ca5efa2e9] on {http://localhost:5000/v1/repositories/ubuntu/tags/latest}

उसके बाद आप अपने निजी डॉकटर रजिस्ट्री में मौजूद है की जाँच करने के लिए रजिस्ट्री एपीआई का उपयोग कर सकते हैं

$ curl -X GET localhost:5000/v1/repositories/ubuntu/tags
{"latest": "e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37"}

अब मैं उस API का उपयोग करके टैग को हटा सकता हूँ !!

$ curl -X DELETE localhost:5000/v1/repositories/ubuntu/tags/latest
true

फिर से जांचें, टैग आपके निजी रजिस्ट्री सर्वर में मौजूद नहीं है

$ curl -X GET localhost:5000/v1/repositories/ubuntu/tags/latest
{"error": "Tag not found"}

2
कृपया, मेरे जवाब को स्पष्टीकरण के लिए नीचे देखें कि यह कमांड क्यों मदद नहीं करता है।
कोनराड क्लेने

2
आप टैग हटाते हैं लेकिन छवि डेटा नहीं। उत्तरार्द्ध स्क्रिप्ट द्वारा किया जाता है जिसका संदर्भ मैंने आपके द्वारा टैग हटाने के बाद दिया है। मैं टैग हटाने के लिए रजिस्ट्री एपीआई का भी उपयोग करता हूं।
कोनराड क्लेन

3
यह प्रोटोकॉल के दृष्टिकोण से प्रत्येक रजिस्ट्री एपीआई सर्वर के कार्यान्वयन तक है, यह मौजूद नहीं है।
लैरी कै

आप सही कह रहे हैं कि यह कार्यान्वयन तक है - लेकिन मैं विहित registryछवि से छवि डेटा को हटाने के लिए एक रास्ता ढूंढ रहा था । स्क्रिप्टिंग को चलाना और चलाना, भले ही यह आदर्श न हो। एक साइड नोट के रूप में, मुझे अभी भी लगता है कि यह एक अधूरा एपीआई है - आप टैग हटा सकते हैं, लेकिन अगर आपको लगता है कि /imagesआप अभी भी सभी बचे हुए छवि डेटा को देखते हैं।
सिंह

रजिस्ट्री एपीआई का उल्लेख करने के लिए धन्यवाद, निजी रजिस्ट्री में छवि को हटाने के लिए एक रास्ता तलाश रहा था। यह विधि मेरे लिए काफी अच्छी है, भले ही यह वास्तव में डिस्क स्थान के बिना 'अनटैगिंग' हो।
हावर्ड ली

16

यह वास्तव में बदसूरत है लेकिन यह काम करता है, पाठ को रजिस्ट्री पर परीक्षण किया जाता है: 2.5.1। मैंने डिलीट को सक्षम करने के लिए कॉन्फ़िगरेशन को अपडेट करने के बाद भी सुचारू रूप से काम करने को हटाने का प्रबंधन नहीं किया। आईडी को वास्तव में प्राप्त करना मुश्किल था, इसे प्राप्त करने के लिए लॉगिन करना पड़ा, शायद कुछ गलतफहमी। वैसे भी, निम्नलिखित कार्य:

  1. कंटेनर में लॉगिन करें

    docker exec -it registry sh
    
  2. अपने कंटेनर और कंटेनर संस्करण से मेल खाने वाले चरों को परिभाषित करें:

    export NAME="google/cadvisor"
    export VERSION="v0.24.1"
    
  3. रजिस्ट्री निर्देशिका में जाएं:

    cd /var/lib/registry/docker/registry/v2
    
  4. अपने हैश से संबंधित फ़ाइलें हटाएं:

    find . | grep `ls ./repositories/$NAME/_manifests/tags/$VERSION/index/sha256`| xargs rm -rf $1
    
  5. मैनिफ़ेस्ट हटाएं:

    rm -rf ./repositories/$NAME/_manifests/tags/$VERSION
    
  6. लॉग आउट

    exit
    
  7. जीसी चलाएं:

    docker exec -it registry  bin/registry garbage-collect  /etc/docker/registry/config.yml
    
  8. यदि सब ठीक से किया गया था तो हटाए गए blobs के बारे में कुछ जानकारी दिखाई गई है।


मैंने ऊपर बताए गए समान चरणों का पालन किया, लेकिन जब मैंने docker रजिस्ट्री {कंटेनर} डिस्क उपयोग की जाँच की तो यह चरणों को करने से पहले जैसा ही दिखा रहा था ... किसी भी विचार क्यों?
सावियो मैथ्यू

काम नहीं करता है। जांचना आसान। जब आप निम्न चरण करते हैं और रेपो को फिर से धक्का देते हैं तो यह कहता है "064794e955a6: परत पहले से ही मौजूद है"
ओडुवन

8

कुछ ग्राहक हैं (पायथन, रूबी, आदि में) जो वास्तव में ऐसा करते हैं। मेरे स्वाद के लिए, यह मेरे रजिस्ट्री सर्वर पर एक रनटाइम (जैसे पायथन) स्थापित करने के लिए टिकाऊ नहीं है, बस मेरी रजिस्ट्री को हाउसकीप करने के लिए!


तो deckschrubberमेरा समाधान है:

go get github.com/fraunhoferfokus/deckschrubber
$GOPATH/bin/deckschrubber

दी गई आयु से अधिक पुरानी छवियां स्वचालित रूप से हटा दी जाती हैं। उम्र का उपयोग कर निर्दिष्ट किया जा सकता -year, -month, -day, या उनमें से एक संयोजन:

$GOPATH/bin/deckschrubber -month 2 -day 13 -registry http://registry:5000

अद्यतन : यहां डेकश्रबर पर एक छोटा परिचय है।


1
deckschrubberबहुत अच्छा है - (एकल बाइनरी) स्थापित करने के लिए बहुत आसान है, और आपको उम्र के साथ नाम (रेगेक्स मैच के साथ) छवियों को हटाने की सुविधा देता है।
रिचवेल

ERRO[0000] Could not delete image! repo=.... tag=latest: /
scythargon

@scythargon को कहना असंभव है कि आपका विनिर्देश सही है।
घबराना

चेतावनी: सचमुच मेरे भंडार पर कुछ नहीं किया।
रिचर्ड वार्बटन ने

दुर्भाग्य से, यह उन छवियों को नहीं हटाएगा जिनके पास टैग नहीं हैं। इसलिए यदि आप किसी एक टैग पर छवियों को धकेलते रहते हैं, तो यह केवल उसी को जांचता है जिसे टैग किया गया है, अन्य को नहीं।
क्रिस्टियन

1

संक्षेप में,

1) आपको एक डॉकटर रेपो के रेपोडिजिस्ट के लिए निम्नलिखित कमांड टाइप करना होगा;

## docker inspect <registry-host>:<registry-port>/<image-name>:<tag>
> docker inspect 174.24.100.50:8448/example-image:latest


[
    {
        "Id": "sha256:16c5af74ed970b1671fe095e063e255e0160900a0e12e1f8a93d75afe2fb860c",
        "RepoTags": [
            "174.24.100.50:8448/example-image:latest",
            "example-image:latest"
        ],
        "RepoDigests": [
            "174.24.100.50:8448/example-image@sha256:5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6"
        ],
...
...

$ {पाचन} = sha256: 5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6

2) रजिस्ट्री REST API का उपयोग करें

  ##curl -u username:password -vk -X DELETE registry-host>:<registry-port>/v2/<image-name>/manifests/${digest}


  >curl -u example-user:example-password -vk -X DELETE http://174.24.100.50:8448/v2/example-image/manifests/sha256:5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6

एक सफल मंगलाचरण के लिए आपको 202 स्वीकृत होना चाहिए।

3-) कूड़ा बीनने वाला चलाएं

docker exec registry bin/registry garbage-collect --dry-run /etc/docker/registry/config.yml

रजिस्ट्री - रजिस्ट्री कंटेनर नाम।

अधिक विस्तार से स्पष्टीकरण के लिए लिंक विवरण यहां दर्ज करें



0

नीचे बैश स्क्रिप्ट नवीनतम को छोड़कर रजिस्ट्री में स्थित सभी टैग हटाता है।

for D in /registry-data/docker/registry/v2/repositories/*; do
if [ -d "${D}" ]; then
    if [ -z "$(ls -A ${D}/_manifests/tags/)" ]; then
        echo ''
    else
        for R in $(ls -t ${D}/_manifests/tags/ | tail -n +2); do
            digest=$(curl -k -I -s -H -X GET http://xx.xx.xx.xx:5000/v2/$(basename  ${D})/manifests/${R} -H 'accept: application/vnd.docker.distribution.manifest.v2+json'  | grep Docker-Content-Digest | awk '{print $2}' )
            url="http://xx.xx.xx.xx:5000/v2/$(basename  ${D})/manifests/$digest"
            url=${url%$'\r'}
            curl -X DELETE -k -I -s   $url -H 'accept: application/vnd.docker.distribution.manifest.v2+json' 
        done
    fi
fi
done

इसके बाद Run

docker exec $(docker ps | grep registry | awk '{print $1}') /bin/registry garbage-collect /etc/docker/registry/config.yml

क्या आप इस बढ़िया स्क्रिप्ट का उपयोग करने के बारे में थोड़ा और विस्तार कर सकते हैं?
खलील घरौई

0

इस उत्तर पर आधारित सरल रूबी लिपि : रजिस्ट्री_क्लाइनर

आप इसे स्थानीय मशीन पर चला सकते हैं:

./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4

और फिर रजिस्ट्री मशीन से ब्लब्स को हटा दें /bin/registry garbage-collect /etc/docker/registry/config.yml


0

यहाँ एक स्क्रिप्ट है जो यवुज़ सर्ट के उत्तर पर आधारित है। यह उन सभी टैग को हटा देता है जो नवीनतम संस्करण नहीं हैं, और उनका टैग 950 से अधिक है।

#!/usr/bin/env bash


CheckTag(){
    Name=$1
    Tag=$2

    Skip=0
    if [[ "${Tag}" == "latest" ]]; then
        Skip=1
    fi
    if [[ "${Tag}" -ge "950" ]]; then
        Skip=1
    fi
    if [[ "${Skip}" == "1" ]]; then
        echo "skip ${Name} ${Tag}"
    else
        echo "delete ${Name} ${Tag}"
        Sha=$(curl -v -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://127.0.0.1:5000/v2/${Name}/manifests/${Tag} 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}')
        Sha="${Sha/$'\r'/}"
        curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE "http://127.0.0.1:5000/v2/${Name}/manifests/${Sha}"
    fi
}

ScanRepository(){
    Name=$1
    echo "Repository ${Name}"
    curl -s http://127.0.0.1:5000/v2/${Name}/tags/list | jq '.tags[]' |
    while IFS=$"\n" read -r line; do
        line="${line%\"}"
        line="${line#\"}"
        CheckTag $Name $line
    done
}


JqPath=$(which jq)
if [[ "x${JqPath}" == "x" ]]; then
  echo "Couldn't find jq executable."
  exit 2
fi

curl -s http://127.0.0.1:5000/v2/_catalog | jq '.repositories[]' |
while IFS=$"\n" read -r line; do
    line="${line%\"}"
    line="${line#\"}"
    ScanRepository $line
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.