チュートリアル:別のプライベート コンテナー レジストリで基本イメージが更新されたときのコンテナー イメージ ビルドを自動化する

ACR タスクでは、いずれかの基本イメージ内で OS またはアプリケーション フレームワークにパッチを適用したときなど、コンテナーの基本イメージが更新されたときのイメージ ビルドの自動化をサポートしています。

このチュートリアルでは、コンテナーの基本イメージが別の Azure コンテナー レジストリにプッシュされたときにクラウドでビルドをトリガーする ACR タスクの作成方法について説明します。 基本イメージが同じ Azure コンテナー レジストリにプッシュされたときにイメージのビルドをトリガーする ACR タスクを作成するチュートリアルもお試しください。

このチュートリアルの内容:

  • 基本レジストリの基本イメージをビルドする
  • 基本イメージを追跡するアプリケーション ビルド タスクを別のレジストリに作成する
  • 基本イメージを更新してアプリケーション イメージ タスクをトリガーする
  • トリガーされたタスクを表示する
  • 更新されたアプリケーション イメージを確認する

前提条件

前のチュートリアルを完了しておく

このチュートリアルでは、既に環境を構成し、シリーズの最初の 2 つのチュートリアルの以下の手順を完了していることを前提としています。

  • Azure Container Registry の作成
  • サンプル リポジトリのフォーク
  • サンプル リポジトリの複製
  • GitHub 個人用アクセス トークンの作成

まだ完了していない場合は、続行する前に次のチュートリアルを完了してください。

Azure Container Registry Tasks を使用してクラウド内のコンテナー イメージをビルドする

Azure Container Registry Tasks を使用してコンテナー イメージ ビルドを自動化する

前のチュートリアルで作成したコンテナー レジストリに加えて、基本イメージを格納するためのレジストリを作成する必要があります。 必要な場合は、元のレジストリとは別の場所にもう 1 つレジストリを作成してください。

環境の構成

次のシェル環境変数に、環境に適した値を設定します。 この手順は必須ではありませんが、このチュートリアルの複数行の Azure CLI コマンドの実行が少し簡単になります。 これらの環境変数を設定しない場合は、それぞれの値を、サンプル コマンド内の現れたところで手動で置き換える必要があります。

BASE_ACR=<base-registry-name>   # The name of your Azure container registry for base images
ACR_NAME=<registry-name>        # The name of your Azure container registry for application images
GIT_USER=<github-username>      # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the second tutorial

基本イメージ更新シナリオ

このチュートリアルでは、基本イメージの更新シナリオについて説明します。 このシナリオは、共通のプライベート コンテナー レジストリで基本イメージを管理しつつ、他のレジストリでアプリケーション イメージを作成する開発ワークフローを反映したものです。 チームで使用する一般的なオペレーティング システムとフレームワーク、一般的なサービス コンポーネントは、基本イメージで指定することができます。

たとえば開発者は、独自のレジストリでアプリケーション イメージを開発しつつ、共通の基本レジストリで管理された一連の基本イメージにアクセスすることができます。 基本レジストリの場所は、別のリージョンのほか、geo レプリケーションされた場所でもかまいません。

コード サンプルには 2 つの Dockerfile が含まれます。これは、アプリケーション イメージと、アプリケーション イメージが基本として指定するイメージです。 以下のセクションでは、基本イメージの新しいバージョンが異なる Azure コンテナー レジストリにプッシュされたときに、アプリケーション イメージのビルドを自動的にトリガーする ACR タスクを作成します。

  • Dockerfile-app:基になる Node.js バージョンを表示する静的な Web ページをレンダリングする小さな Node.js Web アプリケーションです。 バージョン文字列がシミュレートされ、基本イメージで定義されている環境変数 NODE_VERSION の内容が表示されます。

  • Dockerfile-base:Dockerfile-app によってそのベースとして指定されるイメージ。 これ自体が Node イメージに基づき、NODE_VERSION 環境変数を含みます。

以降のセクションでは、タスクを作成し、基本イメージ Docker ファイルで値 NODE_VERSION を更新してから、ACR Tasks を使用して基本イメージをビルドします。 ACR タスクによって新しい基本イメージがレジストリにプッシュされると、アプリケーション イメージのビルドが自動的にトリガーされます。 必要に応じて、アプリケーション コンテナー イメージをローカルで実行して、ビルドされたイメージの別のバージョンの文字列を表示します。

このチュートリアルでは、ACR タスクにより、Dockerfile で指定されたアプリケーション コンテナー イメージをビルドしてプッシュします。 ACR タスクでは、複数ステップ タスクを実行することもできます。その場合、YAML ファイルを使用して、複数のコンテナーをビルド、プッシュ、および (必要に応じて) テストする手順を定義します。

基本イメージをビルドする

ACR タスクの "クイック タスク" で、az acr build を使用して基本イメージをビルドすることから開始します。 シリーズの最初のチュートリアルで説明したように、このプロセスではイメージがビルドされるだけでなく、ビルドが成功した場合にイメージがコンテナー レジストリにプッシュされます。 この例では、イメージが基本イメージ レジストリにプッシュされます。

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

プライベートの基本イメージを追跡するタスクを作成する

次に、az acr task create を使用して、アプリケーション イメージ レジストリにタスクを作成すると共に、マネージド ID を有効にします。 マネージド ID は、後続の手順で、基本イメージ レジストリに対してタスクの認証を行う目的で使用します。

この例では、システム割り当て ID を使用しますが、特定のシナリオ向けにユーザー割り当てマネージド ID を作成して有効にしてもかまいません。 詳細については、「ACR タスクでの Azure マネージド ID を使用したクロスレジストリ認証」を参照してください。

az acr task create \
    --registry $ACR_NAME \
    --name baseexample2 \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file Dockerfile-app \
    --git-access-token $GIT_PAT \
    --arg REGISTRY_NAME=$BASE_ACR.azurecr.io \
    --assign-identity

このタスクは、前のチュートリアルで作成したタスクに似ています。 これは、--context によって指定されたリポジトリにコミットがプッシュされたらイメージのビルドをトリガーするよう ACR Tasks に指示します。 前のチュートリアルでイメージのビルドに使用された Dockerfile にはパブリックの基本イメージ (FROM node:15-alpine) が指定されていますが、このタスクの Dockerfile である Dockerfile-app には基本イメージ レジストリ内の基本イメージを指定します。

FROM ${REGISTRY_NAME}/baseimages/node:15-alpine

この構成により、このチュートリアルの後半で、基本イメージ内のフレームワークの修正プログラムを簡単にシミュレートできます。

基本レジストリに対するプル アクセス許可を ID に付与する

基本イメージ レジストリからイメージをプルするためのアクセス許可をタスクのマネージド ID に付与するために、まず az acr task show を実行して、その ID のサービス プリンシパル ID を取得します。 次に、az acr show を実行して、基本レジストリのリソース ID を取得します。

# Get service principal ID of the task
principalID=$(az acr task show --name baseexample2 --registry $ACR_NAME --query identity.principalId --output tsv) 

# Get resource ID of the base registry
baseregID=$(az acr show --name $BASE_ACR --query id --output tsv) 

az role assignment create を実行して、レジストリに対するプル アクセス許可をマネージド ID に割り当てます。

az role assignment create \
  --assignee $principalID \
  --scope $baseregID --role acrpull 

ターゲット レジストリの資格情報をタスクに追加する

タスクに資格情報を追加するには、az acr task credential add を実行します。 タスクのシステム割り当てマネージド ID が資格情報にアクセスできることを示す --use-identity [system] パラメーターを渡してください。

az acr task credential add \
  --name baseexample2 \
  --registry $ACR_NAME \
  --login-server $BASE_ACR.azurecr.io \
  --use-identity [system] 

タスクを手動で実行する

az acr task run を使用してタスクを手動でトリガーし、アプリケーション イメージをビルドします。 基本イメージに対するアプリケーション イメージの依存関係がタスクで追跡されるようにするために、この手順が必要となります。

az acr task run --registry $ACR_NAME --name baseexample2

次のオプションの手順を実行する場合は、タスクが完了したら、実行 ID ("da6" など) をメモしておきます。

省略可能:アプリケーション コンテナーをローカルで実行する

ローカルで作業し (Cloud Shell ではなく)、Docker がインストールされている場合は、コンテナーを実行して、その基本イメージをリビルドする前に Web ブラウザーでアプリケーションのレンダリングを確認します。 Cloud Shell を使用する場合は、このセクションをスキップしてください (Cloud Shell では az acr login または docker run はサポートされていません)。

最初に、az acr login を使用してコンテナー レジストリに対して認証します。

az acr login --name $ACR_NAME

次に、docker run を使ってコンテナーをローカルで実行します。 <run-id> を、前の手順の出力にあった実行 ID ("da6" など) に置き換えます。 この例では、コンテナーに myapp という名前を付け、停止したときにコンテナーを削除する --rm パラメーターが含まれています。

docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

ブラウザーで http://localhost:8080 に移動します。次のような Node.js バージョン番号が Web ページに表示されます。 後の手順で、バージョン文字列に "a" を追加して、バージョンを増やします。

ブラウザーのサンプル アプリケーションのスクリーンショット

コンテナーを停止して削除するには、次のコマンドを実行します。

docker stop myapp

ビルドを一覧表示する

次に、az acr task list-runs コマンドを使用して、ご使用のレジストリで ACR タスクが完了したタスク実行の一覧を表示します。

az acr task list-runs --registry $ACR_NAME --output table

前のチュートリアルを完了している場合 (レジストリを削除していない場合)、次のような出力が表示されます。 タスク実行番号と最新の実行 ID をメモします。これによって、次のセクションで基本イメージを更新した後に出力を比較できます。

az acr task list-runs --registry $ACR_NAME --output table
UN ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

基本イメージを更新する

ここで、基本イメージでフレームワークのパッチをシミュレートします。 Dockerfile-base を編集して、NODE_VERSION で定義されたバージョン番号の後に "a" を追加します。

ENV NODE_VERSION 15.2.1a

クイック タスクを実行して、変更された基本イメージをビルドします。 出力の実行 ID をメモします。

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

ビルドが完了し、ACR タスクによって新しい基本イメージがレジストリにプッシュされると、アプリケーション イメージのビルドがトリガーされます。 前に作成したタスクがアプリケーション イメージ ビルドをトリガーするのに少し時間がかかる場合があります。これは、新しくビルドされ、プッシュされた基本イメージを検出する必要があるためです。

更新更新されたビルドを一覧表示する

これで基本イメージを更新したので、もう一度タスクの実行を一覧表示して、以前の一覧と比較します。 最初に出力に違いがない場合は、周期的にコマンドを実行して、一覧に表示される新しいタスクの実行を確認します。

az acr task list-runs --registry $ACR_NAME --output table

出力は次のようになります。 最後に実行されたビルドのトリガーは "イメージの更新" であり、これは、タスクが基本イメージのクイック タスクによって開始されたことを示しています。

az acr task list-runs --registry $ACR_NAME --output table
         PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca13      baseexample2    linux       Succeeded  Image Update  2020-11-21T00:06:00Z  00:00:43
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

新しくビルドされたコンテナーを実行する次のオプションの手順を実行し、更新後のバージョン番号を表示する場合は、イメージの更新によってトリガーされたビルドの実行 ID の値をメモしておきます (前の出力では "ca13")。

省略可能:新しくビルドされたイメージを実行する

ローカルで作業しており (Cloud Shell ではなく)、Docker がインストールされている場合は、そのビルドが完了したら新しいアプリケーション イメージを実行します。 <run-id> を、前の手順で取得した実行 ID に置き換えます。 Cloud Shell を使用する場合は、このセクションをスキップしてください (Cloud Shell では docker run はサポートされていません)。

docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

ブラウザーで http://localhost:8081 に移動します。Web ページに更新された Node.js バージョン番号 ("a" が追加された) が表示されます。

ブラウザーの更新されたサンプル アプリケーションのスクリーンショット

基本イメージを新しいバージョン番号に更新しましたが、最後にビルドされたアプリケーション イメージによって新しいバージョンが表示されることに注意してください。 ACR Tasks によって変更が基本イメージに反映され、アプリケーション イメージが自動的にリビルドされました。

コンテナーを停止して削除するには、次のコマンドを実行します。

docker stop updatedapp

次のステップ

このチュートリアルでは、イメージの基本イメージが更新されたときにコンテナー イメージ ビルドを自動的にトリガーするタスクを使用する方法を説明しました。 次のチュートリアルに進んで、定義されたスケジュールでタスクをトリガーする方法を学習してください。