最近在建置 container image 時,常會踩到 exceeded 的錯誤,這是因為 docker 在 2020 時,公告了新的收費機制,並為拉取 container image 的 API 加上了限制,沒有登入的使用者現在每6個小時只能有 100 個 pull requests可用;有登入且採用免費方案的使用者,每6個小時有 200 個 pull requests 可用。這在初期測試 pipeline 時,根本很容易就用超過。
上網搜尋看有沒有方法可以避過這限制,後來在 gitlab 網站上找到文章:Caching Docker images to reduce the number of calls to DockerHub from your CI/CD infrastructure | GitLab
文章裡有提到兩個方法,第一個簡單的方法就是登入,這樣可以提升到 200 個 pull requests。
因為大部分的 executor 都是使用 docker 或 docker + machine,所以設定方法可以單純的在 pipeline 裏面作 docker login,但這樣還要多塞指令跟 credential 。gitlab 很貼心的提供了一個內建的變數,要用這個變數,需要在 gitlab 專案的 settings > CI/CD > Variables 裡,去增加 DOCKER_AUTH_CONFIG ,那在執行 pipeline 時,gitlab-runner 看到有這個變數,就會自動做 login 的動作。
DOCKER_AUTH_CONFIG 的內容可以透過以下方式取得:
- 在終端機用指令先登入 index.docker.io:
docker login
- 用 docker 指令登入後,在家目錄的 .docker 目錄下就會出現 config.json :
cat ~/.docker/config.json
- 用 jq 指令讓內容變成一行:
jq -c "." ~/.docker/config.json
輸出的結果,就可以拿來填了。
第二個方法,則是建置 Registry mirror。
找一台已經安裝 docker 的主機,然後使用 docker 啟動 registry container。在啟動的時候帶入環境參數 REGISTRY_PROXY_REMOTEURL
docker run -d -p 6000:5000 \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
--restart always \
--name registry registry:2
然後登入到 gitlab-runner 所在的主機,修改 /etc/docker/daemon.json
,內容如下
{
"registry-mirrors": ["http://<your-registry-mirror-server:6000"]
}
修改完以後,讓 dockerd 重新載入設定:
sudo systemctl reload docker
再用 docker info | grep -A 1 -B 1 Mirror
確認。
這樣就設定完成了。
那要怎麼知道 gitlab-runner 在建置時有使用這個 registry mirror 呢?這時可以用 curl 指令來檢查
watch -n 60 curl -s http://<your-registry-server>:6000/v2/_catalog
輸出結果大致會是這樣
{"repositories":["library/docker","library/python"]}
至此,就可以算是解決了 exceeded 的問題啦。
沒有留言:
張貼留言