Buildpacksを使ってコンテナーイメージを作成し、Azure Container Registryへプッシュしたい

このエントリは2023/05/25現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。

問い合わせ

いつもとは違う人から、以下のような問い合わせをもらった。

現在アプリケーションのコンテナー化を進めているのだが、Dockerfileが秘伝のタレ的になっており、できればDockerfileを使わずにビルドし、コンテナーイメージを作成したい。使っている言語はJava、Kotlin、Goなど多岐にわたる。
– AzureだとSpring Appsで類似のことができるのは知っているが、Spring Apps以外でその機能は使えないのか?
– 作成したコンテナーイメージをAzure Container Registryにプッシュしたいが、コンテナーイメージの作成から一気通貫にできないか?

確かにAzure Spring Apps EnterpriseだったらJavaのみならず、C#、Python、Go、PHPなど、種々の言語に対応したTanzu Buildpacksを使っていい感じにできる(Spring Apps Standard/Basicの場合はkpacksを中で使っているが、利用可能なのはJavaとC#のみ)。

Azure Spring Apps Enterprise プランでポリグロット アプリをデプロイする方法 / How to deploy polyglot apps in the Azure Spring Apps Enterprise plan
https://learn.microsoft.com/azure/spring-apps/how-to-enterprise-deploy-polyglot-apps

つまるところ、

  • Cloud Native Buildpacksを使ってうまくやってくれる方法はないのか
  • pack CLIを使ってビルドするのでもいいのだが、できればdocker pushを手で実行したくないので、いい感じにできないか

ということのよう。以下のドキュメントにも記載がある通り、Azure Container RegistryにPushする際にコンテナー化する仕組みはある。

チュートリアル:Azure Container Registry タスクを使用して、クラウドでコンテナー イメージをビルドしてデプロイする / Tutorial: Build and deploy container images in the cloud with Azure Container Registry Tasks
https://learn.microsoft.com/azure/container-registry/container-registry-tutorial-quick-task

この方法では、Dockerfileに基づいてコンテナーイメージを作るので、Dockerfile自体は必要。

az acr build
https://learn.microsoft.com/cli/azure/acr?view=azure-cli-latest#az-acr-build

今回の場合はDockerfileを含まないソースコードを渡す、もしくはGitリポジトリのURLを渡してなんとかしたい、ということらしい。

どうすればいい?

現在Public Previewなので、一般提供されるタイミングで動作やコマンドが変わる可能性があるので注意が必要ではあるが、Cloud Native Buildpacksのビルダーに任せる方法がある。

Cloud Native Buildpacks を使用して、アプリからイメージをビルドしてプッシュする / Build and push an image from an app using a Cloud Native Buildpack
https://learn.microsoft.com/azure/container-registry/container-registry-tasks-pack-build
az acr pack build
https://learn.microsoft.com/cli/azure/acr/pack?view=azure-cli-latest#az_acr_pack_build

ソースコードとともにCloud Native Buildpacksの仕様に従って実装されたBuilderを使うよう指示すると、ビルドからコンテナーイメージ作成、イメージのプッシュまでよろしくやってくれる(az acr pack buildでは、pack CLI(厳密にはOryx内部でpack CLIを呼び出している)を使ってビルドからコンテナーイメージ生成までを実施)。

Paketo Builderの場合、利用できるBuilderは以下から確認できる。

Paketo Builders Reference
https://paketo.io/docs/reference/builders-reference/

【注意】
Cloud Native Buildpacks自体は仕様を決めているだけなので、Cloud Native Buildpacksが作成したBuildpacksというのは存在しない(シマノの自転車がないのと同じ)。

Cloud Native Buildpacks
https://buildpacks.io/

実際にやってみる

今回はJVM言語であるKotlin + Spring BootのREST APIをコンテナー化し、Azure Container RegistryにPushし、実際に動作するかを試してみる。利用するBuilderは、軽量な paketobuildpacks/builder-jammy-tiny。あと、事前にAzure Container Registryは作成済み(SKUは問わない)。ソースツリーは以下のよう。

.
└─src
    ├─main
    │  ├─kotlin
    │  │  └─com
    │  │      └─example
    │  │          └─demo
    │  └─resources
    └─test
        └─kotlin
            └─com
                └─example
                    └─demo

やり方は非常に簡単。以下の構文に従って、コマンドを発行する。

az acr pack build \
  -r $ACR \
  -t $ACR.azurecr.io/<コンテナーイメージ>:<タグ> \
  --builder <Builder名> \
  <ソースコードの場所>

実際の呼び出しは以下のよう。

az acr pack build \
  -r $ACR\
  -t {{.Run.Registry}}/kotlindemo:{{.Run.ID}} \
  --builder paketobuildpacks/builder-jammy-tiny \
  --pull .

現時点(2023/05/25)では、--pullがないと失敗することがある。ドキュメントにも記載の通り、Azure Container Registryにキャッシュせず、かつ--pullを明示的に指定していないと、pack CLIに対して存在しないフラグ (--no-pull) が渡るため。

https://github.com/Azure/azure-cli/blob/b527951889402f7bdf79a7782ac6e0c9c9b48139/src/azure-cli/azure/cli/command_modules/acr/pack.py#L61-L62

コンテナーイメージは216MBほど。jlinkなどで削っていないので、実際にはもっと小さくできるが、Dockerfileがなくてもこれぐらいはできる。ただ、作成日がなぜ43年前なのだ?これもPreviewゆえのことなのかな?

REPOSITORY                                           TAG       IMAGE ID       CREATED        SIZE
logicojp.azurecr.io/logicojp.azurecr.io/kotlindemo   cem       80ee0823f50c   43 years ago   216MB

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください