Artifact Registryにローカルで作成したコンテナイメージをpushしてCloud Run ジョブをデプロイする

Artifact RegistryのリポジトリへローカルのDockerで作成したDockerイメージをpushして、そのイメージを元にCloud Run ジョブをデプロイするやり方を説明した記事となります。
2024.06.09

日々Cloud Run ジョブに向き合っているデータアナリティクス事業本部の根本です。
今回はCloud Run ジョブのデプロイを、ローカルで作成したコンテナイメージを元に行なってみました。

やりたいこと

ローカルでDockerイメージを作成して、Artifact Registryにpushして、そのイメージを元にジョブを作る、というのがやりたいことです。
イメージ図は以下となります。

それでは粛々とやってみます。

やってみる

リポジトリ作成

まずはArtifact Registryにリポジトリを作成します。

gcloud artifacts repositories create test-repository --locations=asia-northeast1 --repository-format=docker

ポイントとしては、リポジトリはロケーション単位で作成されるのでlocationsで作りたいロケーションを指定します。
またリポジトリに保存するファイル形式によってrepository-formatを選択します。今回はDockerなのでdockerを指定しています。

Dockerの認証情報設定

以下のコマンドを実行します。

 gcloud auth configure-docker asia-northeast1-docker.pkg.dev

上記コマンドは、gcloudコマンドを使用して指定したDockerレジストリに対するDockerの認証情報を設定するためのコマンドです。
ロケーション名-docker.pkg.devは、pushしたいArtifact Registryのドメインを指します。
またArtifact RegistryのDocker形式のリポジトリは以下のドメイン形式となります。

"ロケーション名"-docker.pkg.dev

ドメインに関しては、リポジトリ作成後にAritfact Registryの画面からでも確認することができます(下記画像の赤枠)。

実行するコマンドでは今回作成したArtifact Registryのロケーションのasia-northeast1を指定しています。
このコマンドを実行すると、DockerがArtifact Registryの特定のレジストリにアクセスするための認証情報が設定されます。
よって、Docker CLIでGoogle CloudのArtifact Registryに対して認証されるようになり、イメージのpushができるようになります。

Dockerイメージ作成とpush

実行したらHello Worldと出力するDockerfileを作成します。

FROM google/cloud-sdk:latest
CMD ["echo", "Hello World!"]

作成したDockerfileが保存されているディレクトリでDockerイメージ作成のため以下コマンドを実行します。

docker build -t asia-northeast1-docker.pkg.dev/プロジェクトID/test-repository/hello-world-image .

イメージ作成に成功したら、Artifact Registryへ作成したイメージをpushします。

docker push asia-northeast1-docker.pkg.dev/プロジェクトID/test-repository/hello-world-image

pushできたら、一応gcloudコマンドでイメージがリポジトリに存在するか確認してみます。

gcloud artifacts docker images list asia-northeast1-docker.pkg.dev/プロジェクトID/test-repository

存在していれば問題なくpushできています。

Artifact Registryのイメージを指定してジョブを作成する

イメージの作成とpushができたので、ジョブをデプロイします。

gcloud run jobs deploy hello-world-run \
--image asia-northeast1-docker.pkg.dev/プロジェクトID/test-repository/hello-world-image \
--region=asia-northeast1 \
--tasks=1 \
--cpu=1 \
--max-retries=0 \
--memory=512Mi \
--parallelism=1 \
--task-timeout=600 \
--region asia-northeast1

色々書いていますが、勘所としては--imageオプションです。
こちらでArtifact Registryへpushしたイメージを指定します。
asia-northeast1-docker.pkg.dev/プロジェクトID/test-repository/hello-world-image
このコマンドを実行するとhello-world-runというジョブ名でジョブが作成されます。
ジョブがデプロイできたら、gcloudコマンドで実行してみます。

gcloud run jobs execute hello-world-run --region=asia-northeast1

Cloud Run jobsのコンソールから、該当のジョブのログにHello World!と出力されていたら成功です。

まとめ

勘所としては以下の3点に注意すれば問題なくできると思います。

  • Dockerの認証情報設定
  • 作成リポジトリのロケーション
  • デプロイ時のimage指定

これらに気をつければ、ローカルのDockerからArtifact Registryへpushが問題なくできます。
また、Cloud Shellで実施する場合も同様の手順で大丈夫です。
この記事がどなたかのお役に立てば嬉しいです。それではまた。

参考

Docker 用の Artifact Registry への認証を構成する
Cloud Run で Python ジョブをビルドして作成する