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