gradle bootjar で作成済みの jar を使って、コンテナイメージの作成からサービスのデプロイまでを gcloud run deploy で行う方法についてまとめます。
Dockerfile を使って Docker Hub からイメージを呼び込むと Google のサポート外のランタイム環境になってしまうのは Google のサポートを受けられるように Python アプリをデプロイする方法で書いたことと同様です。
前提条件
SpringBoot の jar ファイル作成済みであること
※この記事では gradle bootjar コマンドを使用して jar を出力しています。
1 デプロイ用のワークディレクトリを作成
mkdir deploy
cd deploy
2 jar ファイルを配置
cp などで deploy 配下に持ってくる。
3 ビルダーと Java のランタイムの固定
同階層に project.toml を作成し、以下を記述。Java17 環境を例としています。
[build]
builder = "gcr.io/buildpacks/builder:google-22"
[[build.env]]
name = "GOOGLE_RUNTIME_VERSION"
value = "17"
Google のビルダーは指定しないと常に latest が使用されます。latest の指し示すビルダーが古い Java のバージョンをサポートしなくなるとデプロイできなくなる可能性があるため、ここでは固定しています。
4 ソースからのデプロイを実行
ここまでで deploy 配下が以下のようになっている
/xxx.jar (SpringBoot の jar ファイル)
/project.toml
ソースからデプロイを実行する
・application.yaml に SpringBoot の起動環境プロファイルを持っている場合、--set-env-vars で SPRING_PROFILES_ACTIVE の環境変数を与えることでプロファイルの切り替えが行えます。
・JavaVM の引数を追加する場合、同様に --set-env-vars で JAVA_TOOL_OPTIONS に設定します。リファレンス
gcloud run deploy [サービス名] \\
--source .
--set-env-vars SPRING_PROFILES_ACTIVE="production",JAVA_TOOL_OPTIONS="-XX:MaxRAM=256m -XX:+PrintNMTStatistics"
他のオプションについてはリファレンス を参考に
Artifact Registory に置かれるイメージと Run のサービスをタグで紐づけすると管理しやすくなります。
タグの付け方
参考
ランタイムサポート期限
https://cloud.google.com/run/docs/runtime-support?hl=ja