Docker CentOS通常企業內部都不會直接將 docker image 放上 dockerhub,而是透過 private docker registry 的方式共享 image,然而如果有一天你發現某個 Tag 有問題,不想再開放給 User pull,那該怎麼辦呢?
如果是透過 docker 官方提供的 registry 這個 image 建立的 registry server,則有不少的 REST API 可以使用來管理這些 image。
curl localhost:5000/v2/_catalog
{
"repositories": [
"acl",
"actionlog-service",
"apipm-service",
"jenkins",
"sdlc",
"signoff-service",
"ticket-service"
]
}
如上,就可以知道原來 registry server 上已經有這麼多的 repository。
curl localhost:5000/v2/<image>/tags/list
curl localhost:5000/v2/jenkins/tags/list
{
"name":"jenkins",
"tags":["1.0.1"]
}
如上,我們可以看到 jenkins 這個 repository 底下有 1 個 tag,通常還會有更多,不過這裡舉的例子剛好就只有一個。
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
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.