Google Cloud の Buildpacks を触ってみました

Google Cloud 側で提供されている buildpacks を利用したコンテナビルド手順となります。
2023.05.30

こんにちは、川田です。今回は Google Cloud 側で提供されている Buildpacks を利用して、簡単なコンテナをビルドしてみました。本投稿は、その作業ログ的なものとなっています。

環境

  • Google Cloud SDK 432.0.0

Buildpacks とは

Dockerfile を作成せずに、コンテナイメージを作れてしまう、というものになります。

Google Cloud の Buildpack は、アプリケーションのソースコードを取得して本番環境に対応したコンテナ イメージに変換するオープンソース プロジェクトです。Google Cloud で公開される Buildpack は、Cloud Native Buildpack の仕様を実装し、Google Cloud にデプロイ可能なコンテナをビルドして構成するように設計されています。

Google Cloud | Google Cloud の Buildpack

必要ファイルの用意

今回の作業では、Python のコードが実行される単純なコンテナイメージを作ってみます。

以下のディレクトリ構成で、必要となる各種ファイルを用意します。

.
├── app
│   └── main.py
├── project.toml
└── requirements.txt

app/main.py

簡単な Python スクリプトを作成します。

import argparse
import sys
import google.cloud.storage

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--message", type=str, default=None)
    args = parser.parse_args()

    print(f"python version: {sys.version}")
    print(f"google.cloud.storage version: {google.cloud.storage.__version__}")
    print(f"message: {args.message}")

project.toml

ルートディレクトリに project.toml という toml ファイルを用意します。コンテナビルド時に、このファイルが参照されることになります。

[[build.env]]
    name = "GOOGLE_PYTHON_VERSION"
    value = "3.10.11"

[[build.env]]
    name = "GOOGLE_ENTRYPOINT"
    value = "python -m app.main --message $message"

[[build.env]] セクションの name 値に変数名を、value 値にその変数で設定したい値を記述します。各プログラム言語毎に設定できる変数名が決められており、Python の場合、GOOGLE_PYTHON_VERSION が利用する Python のバージョンを、GOOGLE_ENTRYPOINT がコンテナの ENTRYPOINT を指定できるものになります。今回の例では、$message という変数を受け取れるようしています。

Google Cloud | 環境変数を使用してアプリケーションをビルドする

requirements.txt

インストールしたいライブラリを、requirements.txt に記載しておきます。

google-cloud-storage==2.9.0

ルートディレクトリに requirements.txt を用意しておくと、ビルド時に Buildpacks 側で pip install してくれます。

Google Cloud | pip を使用した依存関係の指定

コンテナのビルド/実行

では、ビルドして、コンテナを実行してみます。

ビルド

コンテナビルドの実行環境は、Cloud Build となります。Cloud Build 側でビルドしてくれたイメージは、Artifact Registry に push されるため、事前に Artifact Registry へリポジトリを作成しておきます。

$ gcloud artifacts repositories create sample-buildspack \
--repository-format=docker \
--location=asia-northeast1 \
--description="sample"

gcloud artifacts repositories create

上記作成したディレクトリのルートディレクトリに移動し、gcloud builds submit コマンドを実行します。--pack オプションを付与することで、Buildpacks を利用してビルドしてくれます。

$ gcloud builds submit --pack \
builder=gcr.io/buildpacks/builder:google-22,\
image=asia-northeast1-docker.pkg.dev/kawata-atsushi/sample-buildspack/app

builder キーを利用して、利用したいビルダーを指定することができます(上のコマンドでは gcr.io/buildpacks/builder:google-22 を指定しています)。ビルダーとは、ビルド時に利用されるイメージ、みたいなものでしょうか。Google 側で何種類かのビルダーを用意してくれています。ビルダーの種類毎に、コンテナのベースイメージにあたる OS や、利用可能なプログラミング言語のバージョンが異なってきます。

Google Cloud | ビルダー

gcloud builds submit

実行

コンテナを実行してみます。まずは、Artifact Registry からローカルにイメージを pull してきます。

$ gcloud auth configure-docker asia-northeast1-docker.pkg.dev
$ docker pull asia-northeast1-docker.pkg.dev/PROJECT-ID/sample-buildspack/app:latest

実行します。--env オプションにて、message という環境変数を渡しています。

$ docker run -it --rm --name app --env "message=hello" asia-northeast1-docker.pkg.dev/PROJECT-ID/sample-buildspack/app:latest
python version: 3.10.11 (main, Apr  6 2023, 04:37:00) [GCC 11.3.0]
google.cloud.storage version: 2.9.0
message: hello

想定通りのバージョンにてコンテナが作成されており、message 変数で渡した値を、Python の実行引数として受け取ってくれています。

その他参考資料

以下は Google 側で用意してくれているサンプルコードです。

GitHub | GoogleCloudPlatform/buildpack-samples/sample-python/

(当然ではありますが、)Buildpacks そのものに関しては、CNCF 提供のページが詳しいです。

CNCF | buildpacks.io