34
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

Cloud Build

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

cloud-build_2x.png

基本的には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です。

Cloud_Build_-_consulting-cloud-prd_-_Google_Cloud_Platform.png

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

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

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

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

Cloud_Build_-_consulting-cloud-prd_-_Google_Cloud_Platform.png

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

おわり

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

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

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

34
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?