Ansible 設定 Google Container Registry 搭配 Drone 自動上傳

blog logo


最近剛好有需求要串接 GCR (Google Container Registry),專案如果是搭配 GCP 服務,個人建議就直接用 GCR 了。本篇要教大家如何透過 Ansible 管理遠端機器直接登入 GCR,透過特定的帳號可以直接拉 Image,接著用 docker-compose 來重新起動服務,這算是最基本的部署流程,那該如何用 Ansible 登入呢?請看底下教學。



使用 ansible docker_login 模組


Google 提供了好幾種方式來登入 Docker Registry 服務,本篇使用『JSON 金鑰檔案』方式來長期登入專案,開發者會拿到一個 JSON 檔案,在本機電腦可以透過底下指令登入:


cat keyfile.json | docker login 
-u _json_key
–password-stdin
https://[HOSTNAME]

如果沒有支援 password-stdin 則可以使用底下:


docker login -u _json_key 
-p "$(cat keyfile.json)"
https://[HOSTNAME]

請注意這邊的使用者帳號統一都是使用 _json_key,而在 Ansible 則是使用 docker_login 模組


- name: Log into GCR private registry and force re-authorization
docker_login:
registry: "https://asia.gcr.io"
username: "_json_key"
password: "{{ lookup('template', 'gcr.json', convert_data=False) | string }}"
config_path: "{{ deploy_home_dir }}/.docker/config.json"
reauthorize: yes

注意 password 欄位,請將 gcr.json 放置在 role/templates 目錄,透過 lookup 方式並轉成 string 才可以正常登入,網路上有解法說需要在 password 前面加上一個空白才可以登入成功,詳細情況可以參考這篇


使用 Drone 自動化上傳 Image


講 Drone 之前,我們先來看看 GitLab 怎麼上傳,其實也不難:


cloudbuild:
stage: deploy
image: google/cloud-sdk
services:
- docker:dind
dependencies:
- build
script:
- echo "$GCP_SERVICE_KEY" > gcloud-service-key.json
- gcloud auth activate-service-account –key-file gcloud-service-key.json
- gcloud config set project $GCP_PROJECT_ID
- gcloud builds submit . –config=cloudbuild.yaml –substitutions _IMAGE_NAME=$PROJECT_NAME,_VERSION=$VERSION
only:
- release

透過 gcloud 就可以快速自動上傳。而使用 Drone 設定也是很簡單:


- name: publish
pull: always
image: plugins/docker
settings:
auto_tag: true
auto_tag_suffix: linux-amd64
registry: asia.gcr.io
cache_from: asia.gcr.io/project_id/image_name
daemon_off: false
dockerfile: docker/ponyo/Dockerfile.linux.amd64
repo: asia.gcr.io/project_id/image_name
username:
from_secret: docker_username
password:
from_secret: docker_password
when:
event:
exclude:
- pull_request

其中 password 可以透過後台將 json 資料寫入。這邊有幾個重要功能列給大家參考



  • 使用 cache_from 加速

  • 使用 auto_tag 快速部署標籤


這兩項分別用在什麼地方,cache_from 可以直接看我之前寫過的一篇『在 docker-in-docker 環境中使用 cache-from 提升編譯速度』裡面蠻詳細介紹,並且有影片。而 auto_tag 最大的好處是在 release 開源專案 Image,只要你的 tag 有按照標準格式,像是如果是打 v1.0.1 這時候 Drone 會分別產生三個 Image: 1, 1.0, 1.0.1,下次又 release v1.0.2,這時候 1.0 就會指向 1.0.2,類似這樣以此類推,方便其他使用者抓取 Image。這是在其他像是 GitLab 無法做到,應該說不是無法做到,而是變成要自己寫 script 才能做到。


教學影片


底下是教您如何使用 docker cache 機制,如果你的 Image 特別大,像是有包含 Linux SDK 之類的,就真的用 cache 會比較快喔。



歡迎訂閱我的 Youtube 頻道: http://bit.ly/youtube-boy


更多實戰影片可以參考我的 Udemy 教學系列




comments powered by Disqus