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 教學系列