Google container registry 同步
一、起因
玩 Kubenretes 的基本都很清楚,Kubernetes 很多元件的映象全部託管在gcr.io
這個域名下(現在換成了k8s.gcr.io
);由於眾所周知的原因,這個網站在國內是不可達的;當時由於 Docker Hub 提供了Auto Build
功能,機智的想到一個解決辦法;就是利用 Docker Hub 的Auto Build
,建立只有一行的 Dockerfile,裡面就一句FROM gcr.io/xxxx
,然後讓 Docker Hub 幫你構建完成後拉取即可
這種套路的基本方案就是利用一個第三方公共倉庫,這個倉庫可以訪問不可達的gcr.io
,然後生成映象,我們再從這個倉庫 pull 即可;為此我建立了一個 Github 倉庫(docker-library
);時隔這麼久以後,我猜想大家都已經有了這種自己的倉庫…不過最近發現這個倉庫仍然在有人 fork…
為了一勞永逸的解決這個問題,只能擼點程式碼解決這個問題了
二、倉庫使用
為了解決上述問題,我寫了一個gcrsync
工具,並且藉助Travis CI
讓其每天自動執行,將所有用得到的gcr.io
下的映象同步到了 Docker Hub
目前對於一個gcr.io
下的映象,可以直接替換為gcrxio
使用者名稱,然後從 Docker Hub 直接拉取,以下為一個示例:
# 原始命令 docker pull k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0 # 使用同步倉庫 docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.0
三、同步細節說明
為了保證同步映象的安全性,同步工具已經開源在gcrsync 倉庫,同步細節如下:
- 工具每天由Travis CI 自動進行一次 build,然後進行推送
- 工具每次推送前首先 clone 元資料倉庫gcr
-
工具每次推送首先獲取
gcr.io
指定namespace
下的所有映象(namesapce
由.travis.ymlscript
段定義) -
獲取
gcr.io
映象後,再讀取元資料倉庫(gcr ) 中與namesapce
同名檔案(實際是個 json) - 接著對比雙方差異,得出需要同步的映象
-
最後通過 API 呼叫本地的 docker 進行
pull
、tag
、push
操作,完成映象推送 -
所有映象推送成功後,更新元資料倉庫內
namespace
對應的 json 檔案,最後在生成CHANGELOG ,執行git push
到遠端元資料倉庫
綜上所述,如果想得知
具體gcrxio
使用者下都有那些映象,可直接訪問gcr
元資料倉庫,檢視對應namesapce
同名的 json 檔案即可;每天增量同步的資訊會追加到gcr
倉庫的CHANGELOG.md
檔案中
四、gcrsync
為方便審查映象安全性,以下為gcrsync 工具的程式碼簡介,程式碼倉庫檔案如下:
➜gcrsync git:(master) tree -I vendor . ├── CHANGELOG.md ├── Gopkg.lock ├── Gopkg.toml ├── LICENSE ├── README.md ├── cmd │├── compare.go │├── monitor.go │├── root.go │├── sync.go │└── test.go ├── dist │├── gcrsync_darwin_amd64 │├── gcrsync_linux_386 │└── gcrsync_linux_amd64 ├── main.go └── pkg ├── gcrsync │├── docker.go │├── gcr.go │├── git.go │├── registry.go │└── sync.go └── utils └── common.go
cmd 目錄下為標準的cobra
框架生成的子命令檔案,其中每個命令包含了對應的 flag 設定,如namesapce
、proxy
等;pkg/gcrsync
目錄下的檔案為核心程式碼:
-
docker.go
包含了對本地 docker daemon API 呼叫,包括pull
、tag
、push
操作 -
gcr.go
包含了對gcr.io
指定namespace
下映象列表獲取操作 -
registry.go
包含了對 Docker Hub 下指定使用者(預設gcrxio
)的映象列表獲取操作(其主要用於首次執行compare
命令生成 json 檔案) -
sync.go
為主要的程式入口,其中包含了對其他檔案內方法的呼叫,設定併發池等
五、其他說明
該倉庫不保證映象實時同步,預設每天同步一次(由Travis CI
執行),如有特殊需求,如增加namesapce
等請開啟 issue;最後,請不要再 forkdocker-library
這個倉庫了
轉載請註明出處,本文采用CC4.0 協議授權