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.