上一篇「流程規劃說明」有提到在CI Pipeline的時候我們會Build docker image,所以自然也就要幫Image找尋存放的位置囉!
Docker Image存放位置的選擇其實也很多,像是放在Docker Hub、Azure Container Registry(ACR)、Google Container Registry(GCR)/Google Artifact Registry(GAR)、Amazon Elastic Container Registry(ECR)等等…,這些雲端服務都是可以選擇的選項。
不過,因為我們後面使用的是Google的Cloud Run,所以為了有最佳的網路傳輸與最節省成本的考量(主要還是網路輸出的費用部份),所以就直接選擇放在Google的雲端服務上面。
然而,Google現在可以存放Docker Image的服務其實有兩個,就像上面寫的,有分為Google Container Registry和Google Artifact Registry,這兩者其實對於存放Docker Image沒有什麼太大的差別,主要應該只是URI的部份不一樣。如果真要說的話,GCR就如同它的名稱一樣,就是拿來放Image的,而GAR則是綜合存放庫的服務,除了可以放Image之外,也可以是程式的套件庫,就像.Net的Nuget套件庫一樣。
GAR是由GCR演進而來(官網就是這麼寫的),所以GAR是新的服務,會不會在之後取代GCR很難說…,所以在裡面既然要建立新的存放空間,那就直接從新的服務建立吧!
建立Artifact Registry存放區
進到Google Cloud的管理頁面之後,從左邊的選單找到「Artifact Registry」吧(或是你想要任意門)!如果找不到的話,應該是被隱藏在最下面的「其他產品」裡面。


進入Artifact Registry之後,找到「建立存放區」,接著填寫簡單的資料就可以建立一個新的存放區了,記得格式要選「Docker」,地區的部份輸入「asia」就會篩選出台灣的選項了。


建立完之後從列表中就可以看到剛才建立的項目,點進去之後就會看到Image Repository的URI了,旁邊很貼心的放了一個直接複製的按鈕。

到這邊雖然已經將存放Image的Artifact Registry存放區建立好,但是其實還有一個很重要的事情,那就是身份驗證與授權的部份。如果沒有登入的話是沒辦法將Image推送上來的,所以我們還需要建立對應的服務帳戶。
建立服務帳戶
同樣在Google Cloud左邊的Menu找到「IAM與管理」(任意門在此),進入之後點選左邊的「服務帳戶」,然後在右邊的上方點擊「建立服務帳戶」。

需要填寫的步驟不多,不過在第二步的部份雖然它是寫「選用」,不過我們還是直接把後續會需要使用到的角色權限設定給它吧!分別是「Artifact Registry 寫入者」、「Cloud Run 開發人員」。




產生授權金鑰
建立完成之後,從列表中點擊剛剛建立的服務帳戶,進入之後點擊在上方的「金鑰」分頁。


進入金鑰頁面之後,點擊「新增金鑰」後選擇「建立新的金鑰」,接著確認金鑰類型是JSON,按下「建立」按鈕之後,就會讓你下載json格式的金鑰檔案,務必要保存好。


Docker Login
使用上面產生的金鑰就可以透過docker login指令登入Registry囉!登入的使用者名稱固定為「_json_key」,密碼的部份就是整個json檔案的內容,下面提供一個相對安全的指令登入方式:
cat {Your_Json_File} | docker login -u _json_key --password-stdin https://asia-east1-docker.pkg.dev
把上面的{Your_Json_File}的部份取代成下載的json檔名,如果剛剛建立存放區不是選台灣的機房的話,最後面的網址再根據後台顯示的內容修改即可。
登入之後就可以試一下可不可以push docker image,可以從docker hub上面pull一個下來,然後透過docker tag重新更改image repository名稱和tag,就可以push看看囉!