ttl.sh: 一款超實用且免費的 Docker 臨時鏡像匿名倉庫
在平時的工作中,不知道你有沒有經常需要構建容器鏡像進行測試,并且不一定是在構建環境中使用鏡像。這時候就需要將鏡像推送到鏡像倉庫做中轉,然后在別處拉取并運行容器。久而久之,因為忘記清理鏡像倉庫中的“垃圾”鏡像越來越多。
當然,也可以使用類似 Harbor 這種帶有自動清理功能鏡像倉庫。但只是作為臨時鏡像的中轉,Harbor 這種未免太重了。
今天要介紹的 ttl.sh 正適合處理這種場景。
ttl.sh
ttl.sh 是一個匿名的臨時鏡像倉庫,免費使用無需登錄,并且已經開源。無需登錄,鏡像名稱本身就提供了保密性,比如你可以使用 UUID 來作為鏡像名稱,使用同一個 UUID 來推送和拉取鏡像。
使用
ttl.sh 的使用格外簡單,跟平時使用 Docker Hub 或者 Docker Registry 沒差別,只是 tag 的需要注意一下。
- ?
?docker build?
? 構建鏡像時通過 tag 為鏡像指定有效期,比如??ttl.sh/b0a2c1c3-5751-4474-9dfe-6a9e17dfb927:1h?
?。有效期默認是 1 小時,最長是 24 小時。有效的 tag 可以是??5m?
?、??300s?
?、??4h?
?、??1d?
?,如果超過 24 小時有效期會被設置為 24 小時;如果時間格式無效,有效期設置為默認的 1 小時; - 使用?
?docker push?
? 推送鏡像; - 使用?
?docker pull?
? 拉取鏡像。
比如:
# macOS 下默認生成大寫的 UUID,需要轉成小寫;Linux 下直接使用 uuidgen 即可
# docker 鏡像不支持大寫鏡像名
$ IMAGE_NAME=$(uuidgen | tr "[:upper:]" "[:lower:]")
$ docker build -t ttl.sh/${IMAGE_NAME}:5m .
$ docker push ttl.sh/${IMAGE_NAME}:5m
實現
ttl.sh 的源碼開源在 GitHub,實現也不復雜。
ttl.sh 基于 Registry v2 的鏡像倉庫,利用 Registry 的 notification 功能,將鏡像的 push event 發送給 Hooksweb 服務。
Hooks 將 event 中的鏡像信息解析并記錄在 Redis 中,主要是記錄鏡像的過期時間;同時有個 Reaper 的定時任務定期從 Redis 獲取鏡像的信息,過期的鏡像會調用 Registry 的 REST API 進行清理。