チュートリアル:Azure コンテナー レジストリで基本イメージの更新時にコンテナー イメージ ビルドを自動化する

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

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

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

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

前提条件

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

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

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

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

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

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

環境の構成

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事では、Azure CLI のバージョン 2.0.46 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

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

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

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

このチュートリアルでは、基本イメージとアプリケーション イメージが 1 つのレジストリで管理されている状況での基本イメージの更新について説明します。

コード サンプルには 2 つの Dockerfile が含まれます。これは、アプリケーション イメージと、アプリケーション イメージが基本として指定するイメージです。 以下のセクションでは、基本イメージの新しいバージョンが同じコンテナー レジストリにプッシュされたときに、アプリケーション イメージのビルドを自動的にトリガーする 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 $ACR_NAME --image baseimages/node:15-alpine --file Dockerfile-base .

タスクを作成します。

次に、az acr task create を使用してタスクを作成します。

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

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

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

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

アプリケーション コンテナーをビルドする

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

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

次のオプションの手順を実行する場合は、タスクが完了したら、実行 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 をメモします。これによって、次のセクションで基本イメージを更新した後に出力を比較できます。

RUN ID    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual     2020-11-20T23:07:29Z  00:00:27

基本イメージを更新する

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

ENV NODE_VERSION 15.2.1a

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

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

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

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

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

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

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

Run ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual        2020-11-20T23:07:29Z  00:00:27

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

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

ローカルで作業しており (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

次のステップ

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

パブリック ソースが基になっている基本イメージを管理するための完全なワークフローについては、「Azure Container Registry タスクを使用してパブリック コンテンツを使用および保守する方法」を参照してください。

次のチュートリアルに進んで、定義されたスケジュールでタスクをトリガーする方法を学習してください。