CloudBuildで設定した環境変数をDockerに渡す


最近会社でGCPを使っている@kshibata101です。

GCPのCI/CDサービスであるCloud Buildで環境変数を設定しDockerを動かすときにちょっと詰まったので、方法を備忘録的に残そうと思います。

Cloud Build

GCPでCI/CDを可能にしてくれるサービスです。
まだ出て間もないサービスで、2019年1月現在ではトリガーの機能がベータ版のようです。

基本的にはcloudbuild.yamlというファイルを用意し、そこにコマンドを書いていくことでCI/CDを実現します。
cloudbuild.yamlを用意せずとも、Dockerfileを与えればそれを勝手にビルドしてくれる設定も可能ですが、ここではyamlで設定する方法を記載します。

変数を渡すフロー

上でも触れた通り、CloudBuildではビルドの対象として

  • Dockerfileをそのまま指定する
  • cloudbuild.yamlというビルド手順を書いたファイルを用意する

という2通りがありますが、2番目のcloudbuild.yamlを用意する場合は変数代入の機能が使えます。

ただ、ここの変数はあくまでcloudbuild.yaml内で使える変数なので、そのままではDockerfile内のコンテナで扱う変数を設定することはできません。

しかし、Dockerfileで変数を取り扱う設定にはARGENVがあり、

  • ARG: docker imageをビルドするときに使える外から渡す変数
  • ENV: ビルド後のコンテナ内に設定される内部で使う環境変数

ということなので、ARGで受けてENVに設定すれば、コンテナ内の変数として扱うことができます。

最終的には

CloudBuildの代入変数 => cloudbuild.yamlの--build-arg引数 => DockerfileのARG => ENV

といった感じになります。

設定

具体的な設定方法です。

今回はRailsで5.2から導入されたcredentialsを扱うための環境変数「RAILS_MASTER_KEY」をCloud Buildから設定してみました。

まずレポジトリにDockerfileとcloudbuild.yamlを用意します。
コードはこんな感じになります。

# Dockerfile
FROM gcr.io/google-appengine/ruby

ARG _RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${_RAILS_MASTER_KEY}

:

DockerfileでARG変数はアンダースコアで始めてますが、これはFROMに指定したイメージがすでにRAILS_MASTER_KEYを定義していたのであえてアンダースコアをつけています。

# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ["build", "-t", "gcr.io/$PROJECT_ID/appengine/default:$_TAG",
         "--build-arg", "_RAILS_MASTER_KEY=$_RAILS_MASTER_KEY", "."]

- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/$PROJECT_ID/appengine/default:$_TAG"]

- name: 'gcr.io/cloud-builders/gcloud'
  args: ["app", "deploy", "gcp/app-${_PROJECT_ENV}.yaml", "--quiet"
         "--image-url=gcr.io/$PROJECT_ID/appengine/default:$_TAG"]

cloudbuild.yamlは、「build」「push」「deploy」に分けて実行しています。
こちらの変数をアンダースコアで始めているのはCloudBuildの代入変数の仕様のためです。

ファイルの用意が終わったら、gitのレポジトリにpushしておきます。

続いて、CloudBuildに行きトリガーを設定します。
設定方法は公式や他の記事などに譲りますが、gitレポジトリと連携して先程pushしたブランチを指定すればOKです。

設定画面内の「ビルド設定」でcloudbuild.yamlを選択し、レポジトリ内のパスを入れておきます。

また、その下に代入変数を設定します。
先程書いたDockerfileのARGに相当するkeyとvalueを設定します。

なお、_RAILS_MASTER_KEYの他に、環境分割用に_PROJECT_ENV、バージョン管理用に_TAGを設定しています。

あとは保存をして、トリガーを起動させます。
pushしてもいいですし、手動でも起動は可能です。

実行するとログが出るので正しく設定されたか確認します。
deploy後Google App Engineでちゃんと動くか確認できれば設定は完了です。

おわり

鍵などの秘密にしたい変数の場合はIAMで閲覧権限を絞るか、絞れない場合は秘密情報の設定は避けた方が懸命かもしれません。

秘密情報についてはCloud KMSで暗号化しておきbuild時に復号して渡す方法もあったりするので、実現できたらまた残します。

今回はあくまで設定方法の共有ということで、参考になれば幸いです。