Docker イメージをビルドして Azure Container Registry に発行する
Azure DevOps Services | Azure DevOps Server 2022
Azure Pipelines を使用して、Docker イメージをビルドして Azure Container Registry に発行するようにパイプライン ワークフローを設定できます。 この記事では、次のことについて説明します。
- Azure Container Registry を作成する
- Azure VM でセルフホステッド エージェントを設定する
- 管理対象サービス ID を設定する
- Docker レジストリ サービス接続を作成する
- イメージをビルドして Azure Container Registry に発行する
前提条件
GitHub アカウント。 まだお持ちでない場合は、無料でサインアップしてください。
Azure DevOps プロジェクト内のサービス接続管理者ロール。
アクティブなサブスクリプションが含まれる Azure アカウント。 まだお持ちでない場合は無料でサインアップしてください。
コードを取得する
サンプル アプリをフォークまたは複製して、このチュートリアルの手順に従ってください。
https://github.com/MicrosoftDocs/pipelines-javascript-docker
Azure Container Registry を作成する
Azure Portalに移動します。
左側のナビゲーション パネルから [リソースの作成] を選択し、[コンテナー]、[コンテナー レジストリ] の順に選択します。
ご使用のサブスクリプションを選択し、ご使用のリソース グループを選択するか、新しく作成します。
コンテナーレジストリのレジストリ名を入力します。 レジストリ名は Azure 内で一意にする必要があります。また、5 文字以上で構成する必要があります。
ご希望の場所と SKU を選択し、[レビューと作成] を選択します。
設定をレビューし、終わったら [作成] を選択します。
セルフホステッド エージェント VM を設定する
マネージド サービス ID と Azure Pipelines を併用して Docker イメージを Azure Container Registry に発行するには、Azure VM で独自のセルフホステッド エージェントを設定する必要があります。
VM の作成
Azure Portalに移動します。
左側のナビゲーション パネルから [リソースの作成] を選択し、[仮想マシン] ->[作成] を選択します。
ご使用のサブスクリプションを選択してから、コンテナー レジストリの作成時に使用したリソース グループを選択します。
仮想マシンに名前を付け、イメージを選択します。
ユーザー名とパスワードを入力してから、[レビューと作成] を選択します。
設定をレビューして、終わったら [作成] を選択します。
展開が完了したら、[リソースに移動] を選択します。
エージェント プールを作成する
Azure DevOps プロジェクトから、歯車アイコン を選択して、[プロジェクト設定] に移動します。
[エージェント プール] を選択してから、[プールの追加] を選択します。
[新規] を選択し、[セルフホステッド] を [プール タイプ] ドロップダウン メニューから選択します。
プールに名前を付け、[すべてのパイプラインへのアクセス許可を与える] チェックボックスをオンにします。
完了したら [作成] を選択します。
この時点で、以前に作成したプールを選択して [新規エージェント] を選択します。
このウィンドウの手順を使用して、以前に作成した VM でエージェントを設定します。 [コピー] ボタンを選択して、クリップボードにダウンロード リンクをコピーします。
個人用アクセス トークンを作成する
Azure DevOps プロジェクトから、[ユーザー設定] を選択し、[個人用アクセス トークン] を選択します。
[新しいトークン] を選択して、新しい個人用アクセス トークンを作成します。
PAT の名前を入力してから、有効期限を選択します。
[カスタム定義] を [スコープ] 内で選択してから、[すべてのスコープを表示する] を選択します。
[エージェント プール] ->[読み取りおよび管理]、さらに [配置グループ] ->[読み取りおよび管理] を選択します。
完了したら [作成] を選択し、PAT を安全な場所に保存します。
セルフホステッド エージェントを設定する
Azure portal で、VM に接続します。
管理者特権での PowerShell コマンド プロンプトで、次のコマンドを実行してエージェントをダウンロードします。
Invoke-WebRequest -URI <YOUR_AGENT_DOWNLOAD_LINK> -UseBasicParsing -OutFile <FILE_PATH> ##Example: Invoke-WebRequest -URI https://vstsagentpackage.azureedge.net/agent/2.213.2/vsts-agent-win-x64-2.213.2.zip -OutFile C:\vsts-agent-win-x64-2.213.2.zip
次のコマンドを実行し、エージェントを抽出して作成します。
mkdir agent ; cd agent Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("<FILE_PATH>", "$PWD")
次のコマンドを実行して、エージェントの構成を始めます。
.\config.cmd
サーバー URL の入力を求められたら入力します。 例: https://dev.azure.com/fabrikamFiber
認証タイプを尋ねるダイアログが表示されたら Enter キーを押して、PAT 認証を選択します。
以前に作成した個人用アクセス トークンを貼り付けてから、Enter キーを押します。
エージェント プールの名前を入力してから、エージェント名を入力します。
作業フォルダーは既定値のままにし、エージェントをサービスとして実行する際に「Y」と入力します。
エージェントでジョブのリッスンを開始する準備ができたので、続いて VM に Docker をインストールします。 次のコマンドを実行して、Docker をダウンロードします。
Invoke-WebRequest -URI https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -OutFile <DOWNLOAD_PATH>
ダウンロード パスに移動してから、次のコマンドを実行し、Docker をインストールして開始します。
Start-Process 'Docker%20Desktop%20Installer.exe' -Wait install
続いてエージェント フォルダーに戻り、cmd ファイルを実行して、Azure VM でエージェントを実行します。
.\run.cmd
この時点で、Azure DevOps ポータルの [エージェント プール] ->[エージェント] にご使用のエージェントがリストされているはずです。
マネージド ID を設定する
Azure portal で、以前に作成した VM に移動します。
左側のナビゲーション パネルから [ID] を選択してから、システム割り当て ID を有効にします。
完了したら [保存] を選択し、選択内容を確認します。
[Azure ロールの割り当て] を選択し、[ロールの割り当てを追加] を選択します。
[リソース グループ] を [スコープ] ドロップダウン メニューから選択します。
ご使用のサブスクリプションとリソース グループを選択してから、AcrPush ロールを選択します。
手順 5 と 6 を繰り返して、AcrPull ロールを追加します。
Docker レジストリ サービス接続を作成する
Azure DevOps プロジェクトから、歯車アイコン を選択して、[プロジェクト設定] に移動します。
左側のウィンドウから [サービス接続] を選択します。
[新しいサービス接続] を選択し、[Docker レジストリ] を選択して、[次へ] を選択します。
[Azure Container Registry] を選択してから、[マネージド サービス ID] を [認証の種類] として選択します。
サブスクリプションID サブスクリプション名と、Azure コンテナー レジストリ ログイン サーバーを入力します。 前の手順で作成した VM のシステム割り当てテナント ID を [テナント ID] テキスト フィールドに貼り付けます。
サービス接続の名前を入力し、[すべてのパイプラインへのアクセス許可を与える] チェック ボックスをオンにします。 このオプションを選択するには、サービス接続管理者ロールが必要です。
完了したら、[保存] を選択します。
ビルドと Azure Container Registry への発行
Azure DevOps プロジェクトから、[Pipelines] を選択し、[パイプラインの作成] を選択します。
ソース コードをホストしているサービスを選択します (Azure Repos や GitHub など)。
リポジトリを選択してから、[スタート パイプライン] を選択します。
既定の YAML パイプラインを削除し、次のスニペットを使用します。
trigger: - main variables: dockerRegistryServiceConnection: '<SERVICE_CONNECTION_NAME>' imageRepository: '<IMAGE_NAME>' dockerfilePath: '$(Build.SourcesDirectory)/app/Dockerfile' tag: '$(Build.BuildId)' stages: - stage: Build displayName: Build and publish stage jobs: - job: Build displayName: Build job pool: name: '<YOUR_AGENT_POOL_NAME>' steps: - task: DockerInstaller@0 inputs: dockerVersion: '17.09.0-ce' - task: Docker@2 displayName: Build and publish image to Azure Container Registry inputs: command: buildAndPush containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageRepository) dockerfile: $(dockerfilePath) tags: | $(tag)
パイプラインの実行が完了したら、Azure でイメージを確認できます。 Azure portal で Azure Container Registry に移動してから、[リポジトリ] を選択します。
リソースをクリーンアップする
このアプリケーションを引き続き使用する予定がない場合は、リソース グループを削除して、継続的な料金が発生しないようにします。
az group delete --name myapp-rg