GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
字體大小: +
2 分鐘閱讀時間 (429 個字)

Docker registry 刪除特定 Tag

bright-mockup-scene-with-macbook-pro

tags: Docker CentOS

Docker registry 刪除特定 Tag

一、前言

通常企業內部都不會直接將 docker image 放上 dockerhub,而是透過 private docker registry 的方式共享 image,然而如果有一天你發現某個 Tag 有問題,不想再開放給 User pull,那該怎麼辦呢?

二、解決方法

如果是透過 docker 官方提供的 registry 這個 image 建立的 registry server,則有不少的 REST API 可以使用來管理這些 image。 

先列出所有的 Repository:

  • 指令:
    curl localhost:5000/v2/_catalog
  • 回傳:

{
  "repositories": [
    "acl",
    "actionlog-service",
    "apipm-service",
    "jenkins",
    "sdlc",
    "signoff-service",
    "ticket-service"
  ]
}

如上,就可以知道原來 registry server 上已經有這麼多的 repository。

列出特定 repository 的 tags:

  • 指令: 
    curl localhost:5000/v2/<image>/tags/list
  • 例: 
    curl localhost:5000/v2/jenkins/tags/list
  • 回傳:
    {
        "name":"jenkins",
        "tags":["1.0.1"]
    }

如上,我們可以看到 jenkins 這個 repository 底下有 1 個 tag,通常還會有更多,不過這裡舉的例子剛好就只有一個。

取得 tag 的 digest

Digest 對於 registry server 是一個唯一的識別碼,根據官方的 API 文件說明,任何的操作必須要給定 digest 才行。

  • 指令: 
    curl -X GET --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I 
    http://localhost:5000/v2/<image>/manifests/<tag>
  • 例: 
    curl -X GET --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I 
    http://localhost:5000/v2/jenkins/manifests/1.0.1
  • 回傳:
    HTTP/1.1 200 OK
    Content-Length: 5971
    Content-Type: application/vnd.docker.distribution.manifest.v2+json
    Docker-Content-Digest: sha256:d1007da6cbe2e589eb92099591a29e54570af170b904998fd0ec237d68b3ce94
    Docker-Distribution-Api-Version: registry/2.0
    Etag: "sha256:d1007da6cbe2e589eb92099591a29e54570af170b904998fd0ec237d68b3ce94"
    X-Content-Type-Options: nosniff
    Date: Fri, 19 Jun 2020 00:56:56 GMT

如上,Docker-Content-Digest 就是我們要取得的。

開始刪除

STEP 1: 確定 registry 有開放 刪除功能

指令: 

docker exec -it registry sh -c "cat /etc/docker/registry/config.yml"

如上圖,確定有 enable 了才能刪,否則會跳錯誤訊息提示。

STEP 2: 刪除 manifest

指令: 

curl -X DELETE http://localhost:5000/v2/jenkins/manifests/sha256:d1007da6cbe2e589eb92099591a29e54570af170b904998fd0ec237d68b3ce94

STEP 3: 觸發 registry 內建的 GC 機制

指令:

docker exec -it registry sh -c "registry garbage-collect /etc/docker/registry/config.yml"

 

STEP 4: 移除在 volume 內的真實檔案

給定:

volume name => reg-data
image name => jenkins
tag => 1.0.1

 

則指令如下:

rm -rf /var/lib/docker/volumes/reg-data/_data/docker/registry/v2/repositories/jenkins/_manifests/tags/1.0.1/index/sha256/d1007da6cbe2e589eb92099591a29e54570af170b904998fd0ec237d68b3ce94

rm -rf /var/lib/docker/volumes/reg-data/_data/docker/registry/v2/repositories/jenkins/_manifests/revisions/sha256/d1007da6cbe2e589eb92099591a29e54570af170b904998fd0ec237d68b3ce94

 

 

×
Stay Informed

When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.

Ansible 初體驗 (安裝 Docker)
從原始碼到容器化

相關文章

Comment for this post has been locked by admin.
 

評論