Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

最近会社で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時に復号して渡す方法もあったりするので、実現できたらまた残します。

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

kshibata101
サーバーエンジニア 某ソーシャルゲーム会社でフロント(JS)2年、サーバー(PHP)3年ほど経験後、 現在はVISITS Technologiesという会社でサーバーエンジニアとして従事中。 会社としてGCPに舵切っているところでもあり、主にGCP関連技術を発信していこうと思います。 PHP/Ruby(Rails)/JS/MySQL/Redis/GCP/AWS
vis-its
独自技術ideagramを用いて、人々の「創造性」や「目利き力」の定量化を行い、イノベーター人材の発掘/育成、科学的イノベーション創発支援を行っています。
https://visits.world
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away