星期日, 4月 03, 2022

Registry Mirror

 

最近在建置 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 的內容可以透過以下方式取得:

  1. 在終端機用指令先登入 index.docker.io: docker login
  2. 用 docker 指令登入後,在家目錄的 .docker 目錄下就會出現 config.json : cat ~/.docker/config.json
  3. 用 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 的問題啦。

沒有留言: