วิธีการลบภาพออกจากรีจิสตรี Docker ส่วนตัว?


163

ฉันเรียกใช้รีจิสทรีนักเทียบท่าส่วนตัวและฉันต้องการลบภาพทั้งหมดยกเว้นlatestจากที่เก็บ ฉันไม่ต้องการลบพื้นที่เก็บข้อมูลทั้งหมดเพียงบางส่วนของภาพภายใน เอกสาร APIไม่ได้กล่าวถึงวิธีการที่จะทำเช่นนี้ แต่แน่นอนว่ามันเป็นไปได้หรือไม่


2
คำตอบที่ได้รับการยอมรับไม่ถูกต้องอีกต่อไป (แม้ว่าจะดีมากอย่างแน่นอน) คุณสามารถลบภาพโดยใช้ DELETE / v2 / <name> / manifests / <reference>: docs.docker.com/registry/spec/api/#deleting-an-image
Michael Zelensky

คำตอบ:


116

ขณะนี้คุณไม่สามารถใช้ Registry API สำหรับงานนั้นได้ อนุญาตให้คุณลบที่เก็บหรือแท็กเฉพาะเท่านั้น

โดยทั่วไปการลบที่เก็บหมายความว่าแท็กทั้งหมดที่เกี่ยวข้องกับ repo นี้จะถูกลบ

การลบแท็กหมายความว่าการเชื่อมโยงระหว่างรูปภาพและแท็กจะถูกลบ

ไม่มีการข้างต้นจะลบภาพเดียว พวกเขาจะเหลืออยู่บนดิสก์ของคุณ


วิธีแก้ปัญหา

สำหรับวิธีแก้ปัญหานี้คุณต้องจัดเก็บภาพนักเทียบท่าไว้ในเครื่อง

วิธีแก้ปัญหาสำหรับโซลูชันของคุณคือการลบทั้งหมดยกเว้นแท็กล่าสุดและอาจลบการอ้างอิงไปยังรูปภาพที่เกี่ยวข้อง จากนั้นคุณสามารถเรียกใช้สคริปต์นี้เพื่อลบภาพทั้งหมดที่ไม่ได้อ้างอิงโดยแท็กใด ๆ หรือบรรพบุรุษของรูปภาพที่ใช้

คำศัพท์ (รูปภาพและแท็ก)

ลองพิจารณากราฟภาพแบบนี้โดยที่ตัวอักษรพิมพ์ใหญ่ ( 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>โดยใช้ Docker REST API คุณจะได้รับสิ่งนี้:

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

โปรดจำไว้ว่า:นักเทียบท่าจะไม่ลบภาพ! แม้ว่าจะเป็นเช่นนั้นในกรณีนี้มันไม่สามารถลบรูปภาพได้เนื่องจากรูปภาพCเป็นส่วนหนึ่งของบรรพบุรุษสำหรับรูปภาพDที่ถูกแท็ก

แม้ว่าคุณจะใช้สคริปต์นี้จะไม่มีการลบภาพใด ๆ

เมื่อภาพสามารถลบได้

ภายใต้เงื่อนไขที่คุณสามารถควบคุมได้เมื่อใครบางคนสามารถดึงหรือดันไปยังรีจิสทรีของคุณ (เช่นโดยการปิดการใช้งานส่วนต่อประสาน REST) คุณสามารถลบภาพออกจากกราฟภาพหากไม่มีภาพอื่นอ้างอิงและไม่มีแท็กที่อ้างถึง

โปรดสังเกตว่าในกราฟต่อไปนี้รูปภาพไม่ได้Dเป็นพื้นฐานแต่เป็น ดังนั้นไม่ขึ้นอยู่กับ หากคุณลบแท็กในกราฟนี้ภาพจะไม่ถูกใช้โดยภาพใด ๆ และสคริปต์นี้สามารถลบออกได้CBDC<version1>C

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

หลังจากล้างข้อมูลกราฟภาพของคุณจะเป็นดังนี้:

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

นี่คือสิ่งที่คุณต้องการ?


คุณถูกการลบแท็กไม่ได้ลบภาพที่เกี่ยวข้อง มีวิธีการลบภาพที่ได้รับการเข้าถึง ssh กล่องหรือไม่
Leo

1
ฉันได้แก้ไขคำตอบของฉันด้วยวิธีแก้ปัญหาที่ทำงานให้ฉัน ฉันหวังว่ามันจะช่วย
Konrad Kleine

ใช่แล้ว - ฉันเข้าใจว่าภาพถูกสร้างขึ้นแบบค่อยเป็นค่อยไป แต่ฉันต้องการวิธีตัดกิ่งที่ตายแล้ว ขอบคุณ!
Leo

@KonradKleine คุณจะสร้างกราฟภาพจากรายการภาพที่คุณได้รับจากรีจิสทรีได้อย่างไร?
Rafael Barros

9
การเก็บรวบรวมขยะได้มาถึง Registry v2.4.0 docs.docker.com/registry/garbage-collection แล้ว
Markus Lindberg

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: ลบรายการที่ทำเครื่องหมายไว้

รันคำสั่งนี้ในคอนเทนเนอร์ที่ลงทะเบียนนักเทียบท่าของคุณ:

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/..." แต่ไม่ได้เปลี่ยนพื้นที่ดิสก์ที่ใช้ ใช้bin / รีจิสทรี github.com/docker/distribution v2.4.1
JamesThomasMoon1979

3
ในการลบภาพคุณควรเรียกใช้รีจิสตรีคอนเทนเนอร์ด้วยพารามิเตอร์ REGISTRY_STORAGE_DELETE_ENABLED = true
Adil

3
ฉันตั้งค่า "ลบ: เปิดใช้งาน" เป็นจริงในไฟล์ /etc/docker/registry/config.yml สำหรับการกำหนดค่านี้ไม่จำเป็นต้องตั้งค่าตัวแปร REGISTRY_STORAGE_DELETE_ENABLED @AdilIlhan
Yavuz Sert

Re: ขั้นตอนที่ 3 "Docker-Content-Digest" ต้องอยู่ในส่วนหัวหรือไม่ (ไม่เห็นในเอาต์พุต curl) ฉันควรจะเห็นผลลัพธ์ของการทำเครื่องหมายรายการก่อนที่จะลบรายการที่ทำเครื่องหมายเพื่อรู้ว่าฉันทำเครื่องหมายสำเร็จหรือไม่ ดูเหมือนว่าจะให้ฉันตอบสนอง 202 ไม่ว่าฉันจะส่งอะไร
SteveW

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)}'
มูฮัมหมัด Abdurrahman

63

v2ขณะนี้รีจิสทรีปัจจุบันสนับสนุนการลบผ่านDELETE /v2/<name>/manifests/<reference>

ดู: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image

การใช้งาน: https://github.com/byrnedo/docker-reg-tool

แก้ไข: รายการ<reference>ด้านบนสามารถดึงข้อมูลจากการร้องขอไปยัง

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

และตรวจสอบ Docker-Content-Digestส่วนหัวในการตอบสนอง

แก้ไข 2: คุณอาจต้องเรียกใช้รีจิสทรีด้วยชุด env ต่อไปนี้:

REGISTRY_STORAGE_DELETE_ENABLED="true"

แก้ไข 3: คุณอาจต้องเรียกใช้คอลเลกชันขยะเพื่อเพิ่มพื้นที่ว่างในดิสก์: https://docs.docker.com/registry/garbage-collection/


3
คำตอบอื่น ๆ ที่นี่แสดงวิธีแยกแฮชอ้างอิงอย่างชัดแจ้ง DELETEนี้เป็นสิ่งจำเป็นในการแปลแท็กเป็นสิ่งที่จะส่งผ่านไป
JamesThomasMoon1979

รับข้อผิดพลาดที่ไม่สนับสนุน ฉันให้ค่าการสรุปที่เหมาะสมเป็นข้อมูลอ้างอิง
Winster

1
@ JamesThomasMoon1979 อัปเดตพร้อมคำแนะนำเกี่ยวกับการรับแฮอ้างอิง
byrnedo

11
ใน V2 ด้วยและรับข้อผิดพลาด{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Gadelkareem

1
ตรวจสอบการแก้ไข @Gadelkareem
byrnedo

17

ปัญหาที่ 1

คุณกล่าวถึงว่าเป็นรีจิสทรีนักเทียบท่าส่วนตัวดังนั้นคุณอาจต้องตรวจสอบRegistry APIแทนHub API APIของHubซึ่งเป็นลิงก์ที่คุณให้

ปัญหาที่ 2

API สำหรับนักเทียบท่าเป็นไคลเอนต์ / เซิร์ฟเวอร์โปรโตคอลมันขึ้นอยู่กับการใช้งานของเซิร์ฟเวอร์ว่าจะลบภาพในส่วนหลัง (ฉันคิดว่า)

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}

หลังจากนั้นคุณสามารถใช้Registry APIเพื่อตรวจสอบว่ามีอยู่ในรีจิสตรี Docker ส่วนตัวของคุณ

$ 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
โปรดดูคำตอบของฉันด้านล่างสำหรับคำอธิบายว่าทำไมคำสั่งนี้ไม่ช่วย
Konrad Kleine

2
คุณลบแท็ก แต่ไม่ใช่ข้อมูลภาพ สคริปต์หลังนี้ทำโดยฉันอ้างอิงหลังจากที่คุณลบแท็ก ฉันยังใช้ API รีจิสทรีเพื่อลบแท็ก
Konrad Kleine

3
มันเกินการใช้งานเซิร์ฟเวอร์ API รีจิสตรีแต่ละตัวจากมุมมองของโปรโตคอล แต่ไม่มีอยู่
Larry Cai

คุณถูกต้องแล้วว่ามันขึ้นอยู่กับการใช้งาน - แต่ฉันกำลัง / กำลังมองหาวิธีการลบข้อมูลภาพจากregistryภาพมาตรฐาน SSH ในการเรียกใช้สคริปต์ทำงานแม้ว่ามันจะไม่เหมาะก็ตาม ในฐานะที่เป็นบันทึกด้านข้างฉันยังคงคิดว่ามันเป็น API ที่ไม่สมบูรณ์ - คุณสามารถลบแท็กได้ แต่ถ้าคุณได้รับ/imagesคุณยังคงเห็นข้อมูลภาพที่เหลือทั้งหมด
Leo

ขอบคุณที่กล่าวถึง Registry API กำลังมองหาวิธีลบภาพในรีจิสตรีส่วนตัว วิธีนี้ดีพอสำหรับฉันแม้ว่าจะเป็นเพียง 'ไม่ได้ใส่แท็ก' โดยไม่เพิ่มพื้นที่ว่างในดิสก์
Howard Lee

16

มันน่าเกลียดจริงๆ แต่ใช้งานได้มีการทดสอบข้อความในรีจิสตรี: 2.5.1 ฉันไม่ได้จัดการเพื่อให้การลบทำงานอย่างราบรื่นแม้หลังจากอัปเดตการกำหนดค่าเพื่อเปิดใช้งานการลบ ID เป็นเรื่องยากที่จะดึงออกมาได้ต้องลงชื่อเข้าใช้เพื่อรับมันอาจจะมีบางคนเข้าใจผิด อย่างไรก็ตามงานดังต่อไปนี้:

  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. เรียกใช้ GC:

    docker exec -it registry  bin/registry garbage-collect  /etc/docker/registry/config.yml
    
  8. หากทุกอย่างถูกต้องทำข้อมูลบางอย่างเกี่ยวกับการลบ blobs จะปรากฏขึ้น


ฉันทำตามขั้นตอนเดียวกันที่กล่าวถึงข้างต้น แต่เมื่อฉันตรวจสอบการใช้งานดิสก์นักเทียบท่า {container} การใช้ดิสก์มันแสดงเหมือนเดิมก่อนที่จะทำตามขั้นตอน ... ความคิดใด ๆ ว่าทำไม?
เอพิสโคแม็ตธิว

ไม่ทำงาน ง่ายต่อการตรวจสอบ เมื่อคุณทำตามขั้นตอนต่อไปนี้แล้วกด repo อีกครั้งข้อความจะบอกว่า "064794e955a6: มีเลเยอร์อยู่แล้ว"
Oduvan

8

มีลูกค้าบางคน (ใน Python, Ruby, ฯลฯ ) ซึ่งทำสิ่งนั้นอย่างแน่นอน เพื่อรสนิยมของฉันมันไม่ยั่งยืนที่จะติดตั้งรันไทม์ (เช่น Python) บนเซิร์ฟเวอร์รีจิสตรีของฉันเพียงเพื่อแม่บ้านของฉัน!


ดังนั้นdeckschrubberทางออกของฉันคือ:

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

ภาพที่เก่ากว่าอายุที่กำหนดจะถูกลบโดยอัตโนมัติ อายุสามารถระบุได้ใช้-year, -month, -dayหรือการรวมกันของพวกเขา

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

UPDATE : นี่คือการแนะนำสั้น ๆเกี่ยวกับ deckschrubber


1
deckschrubberค่อนข้างดี - ติดตั้งง่าย (ไบนารีตัวเดียว) และให้คุณลบภาพตามชื่อ (ตรงกับ regex) ตลอดจนอายุ
RichVel

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

@scythargon เป็นไปไม่ได้ที่จะบอกว่าข้อกำหนดของคุณถูกต้องแล้ว
กระวนกระวายใจ

คำเตือน: ไม่ได้ทำอะไรเลยในที่เก็บของฉัน
Richard Warburton

น่าเสียดายที่มันจะไม่ลบภาพที่ไม่มีแท็ก ดังนั้นหากคุณยังคงผลักดันภาพบนแท็กเดียวแท็กนั้นจะตรวจสอบเฉพาะแท็กที่ถูกแท็กไม่ใช่แท็กอื่น
Krystian

1

สั้น ๆ ;

1) คุณต้องพิมพ์คำสั่งต่อไปนี้สำหรับ RepoDigests ของ repo นักเทียบท่า;

## 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"
        ],
...
...

$ {digest} = 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

registry - ชื่อคอนเทนเนอร์รีจิสตรี

สำหรับคำอธิบายรายละเอียดเพิ่มเติมป้อนคำอธิบายลิงก์ที่นี่



0

ด้านล่าง Bash Script ลบแท็กทั้งหมดที่อยู่ในรีจิสตรียกเว้นรุ่นล่าสุด

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

หลังจากการวิ่งครั้งนี้

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

คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธีการใช้สคริปต์ที่ดีนี้อีกเล็กน้อยได้ไหม?
Khalil Gharbaoui

0

สคริปต์ทับทิมง่ายขึ้นอยู่กับนี้คำตอบ: registry_cleaner

คุณสามารถเรียกใช้บนเครื่องท้องถิ่น:

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

และจากนั้นบนเครื่องรีจิสทรีลบ Blobs /bin/registry garbage-collect /etc/docker/registry/config.ymlกับ


0

นี่คือสคริปต์ตามคำตอบของ Yavuz Sert มันจะลบแท็กทั้งหมดที่ไม่ใช่เวอร์ชันล่าสุดและแท็กของพวกเขามากกว่า 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.