10. ソースデプロイ
最後に、今日学んだ手順を巻き戻すような機能を紹介します。
ソースコードだけで Cloud Run にデプロイする方法です。
1. ソースデプロイ
--image の代わりに --source を指定すると、Cloud Build がソースからイメージをビルドして GAR に push し、そのままデプロイまで行います。
cd ~/cloudrun-handson/app
gcloud run deploy handson-app-src \
--source . \
--region ${REGION} \
--allow-unauthenticated
数分待つと、別の Service handson-app-src として同じアプリが公開されます。
成功していれば
ビルドとデプロイに数分かかったあと、Service URL: https://handson-app-src-... が表示されます。
開くと5章と同じレイアウトの画面が出ますが、色とメッセージは赤の v2 です(6章で書き換えた src/index.ts からビルドされます。
7章の v3 は handson-app に設定した環境変数で作ったもので、別の Service である handson-app-src には引き継がれません)。Service の欄が handson-app-src になっていることも確認してください。初回はビルド済みイメージの置き場として cloud-run-source-deploy という Artifact Registry リポジトリが自動で作られます(確認を求められたらそのまま進めてください)。途中で出力が止まって見えても、ビルド待ちなので待って大丈夫です。
このディレクトリには Dockerfile があるのでそれが使われますが、Dockerfile を消しても動きます。
その場合は Google Cloud の Buildpacks が package.json を見て「Node.js アプリだな」と判断し、scripts.start(この教材では node src/index.ts)を起動コマンドにしたコンテナイメージを自動生成します。
Dockerfile を消して同じ gcloud run deploy handson-app-src --source . --region ${REGION} --allow-unauthenticated を実行しても、やはり数分後に同じ画面が返ってきます。
切り替わったかどうかは出力の1行目で分かります。Dockerfile があるときは Building using Dockerfile and deploying container to Cloud Run service [handson-app-src]、消したあとは Building using Buildpacks and deploying container to Cloud Run service [handson-app-src] になります。
Dockerfile を消したくない場合は、この節は読むだけで先に進んでも構いません。
2. では、なぜ今日 Dockerfile から始めたのか
「最初からコンテナイメージをbuild/pushせずにこれを教えてくれれば良かったのに」と思うかもしれません。
このハンズオンの順番には意図があります。
- ソースデプロイは中でやっていることが今日の手順そのものです
- build → push → deploy。
- 仕組みを知った上で使う自動化と、知らずに使う魔法は違います
- 実務では Dockerfile を書く場面が必ず来ます
- 依存OSパッケージ、マルチステージビルド、社内ベースイメージ…
- 逆に、プロトタイプや社内ツールなら「Dockerfile なしでとりあえず公開」で十分なこともあります。
手軽さの階段を自分で選べるのが Cloud Run です:
gcloud run deploy --source . # ソースだけ(Buildpacks におまかせ)
gcloud run deploy --source . # ソース+ Dockerfile(ビルドはおまかせ)
docker build && push && deploy # 全部自分で制御(今日やったこと)
+ Cloud Build トリガー # git push で自動デプロイ(CI/CD)
まとめ
- Cloud Runはコンテナイメージだけでなく、ソースコードのみでもデプロイ可能。
- ソースコードデプロイはGoogle Cloudがかわりにコンテナ化をしてくれているラッパーのようなもの。
- Cloud Runの実務ではDockerfile(そして今回取り扱わなかったCloud Runのyaml(IaC))を利用する。