Azure Pipelines を使用してコンテナー イメージをビルドし、レジストリにプッシュする
- [アーティクル]
-
-
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
この記事では、Azure Pipelines を使用して Docker イメージをビルドし、Azure Container Registry、Docker Hub、および Google Artifact Registry にプッシュするためのセットアップと構成について説明します。 さらに、パイプライン内でのセキュリティで保護された認証に System.AccessToken
を使用する方法について詳しく説明します。
この記事では、Azure Pipelines を使用して Docker イメージをビルドして Docker Hub と Google Artifact Registry にプッシュするためのセットアップと構成について説明します。 さらに、パイプライン内でのセキュリティで保護された認証に System.AccessToken
を使用する方法について詳しく説明します。
Docker イメージをビルドしてコンテナー レジストリにプッシュする YAML パイプラインを作成する方法について説明します。 Docker@2 タスクは、イメージをビルドしてコンテナー レジストリにプッシュするために使用されます。
前提条件
- Azure DevOps プロジェクト。
- コンテナー レジストリ (Docker Hub、Google Artifact Registry、または Azure Container Registry)。
- Dockerfile を含む GitHub リポジトリ。 お持ちでない場合は、 サンプル リポジトリを使用できます ブラウザーでサンプル リポジトリに移動し、GitHub アカウントにフォークします。
- Docker。 セルフホステッド エージェントを使用している場合は、Docker がインストールされ、Docker エンジンが管理者特権で実行されていることを確認します。 Microsoft がホストするエージェントには、Docker がプレインストールされています。
- Azure DevOps プロジェクト。
- コンテナー レジストリ (Docker Hub または Google Artifact Registry)。
- Dockerfile を含む GitHub リポジトリ。 お持ちでない場合は、 サンプル リポジトリを使用できます ブラウザーでサンプル リポジトリに移動し、GitHub アカウントにフォークします。
- Docker。 セルフホステッド エージェントを使用している場合は、Docker がインストールされ、Docker エンジンが管理者特権で実行されていることを確認します。 Microsoft がホストするエージェントには、Docker がプレインストールされています。
Docker サービス接続を作成する
コンテナー イメージをレジストリにプッシュする前に、Azure DevOps でサービス接続を作成する必要があります。 このサービス接続には、コンテナー レジストリで安全に認証するために必要な資格情報が格納されます。 Azure DevOps プロジェクトの Service connections ページに移動して新しいサービス接続を作成し、接続の種類として Docker Registry を選択します。
Docker Hub と Google Artifact Registry のサービス接続を作成するには、さまざまなプロセスがあります。
Azure DevOps Server では、Docker イメージを Azure Container Registry にプッシュすることはできません。
Google Artifact Registry に関連付けられている Docker サービス接続を作成するには:
Google Cloud Platform (GCP) コンソールでプロジェクトを開き、Cloud Shell を開きます
プロジェクト ID とコンピューティング エンジン ゾーンのオプションを入力する時間を節約するには、次のコマンドを実行して既定の構成値を設定してください。
gcloud config set project [PROJECT_NAME]
gcloud config set compute/zone [ZONE]
[PROJECT_NAME]
を GCP プロジェクトの名前に置き換え、[ZONE]
をリソースの作成に使用するゾーンの名前に置き換えてください。 選択するゾーンが不明な場合は、us-central1-a
を使用してください。 次に例を示します。
gcloud config set project azure-pipelines-test-project-12345
gcloud config set compute/zone us-central1-a
プロジェクトの Artifact Registry API を有効にします。
gcloud services enable artifactregistry.googleapis.com
gcloud services enable containerregistry.googleapis.com
Docker イメージを発行するための Azure Pipelines のサービス アカウントを作成してください。
gcloud iam service-accounts create azure-pipelines-publisher --display-name "Azure Pipelines Publisher"
ストレージ管理者 ID とアクセス管理 (IAM) ロールをサービス アカウントに割り当てます。
PROJECT_NUMBER=$(gcloud projects describe \
$(gcloud config get-value core/project) \
--format='value(projectNumber)')
AZURE_PIPELINES_PUBLISHER=$(gcloud iam service-accounts list \
--filter="displayName:Azure Pipelines Publisher" \
--format='value(email)')
gcloud projects add-iam-policy-binding \
$(gcloud config get-value core/project) \
--member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
--role roles/storage.admin
サービス アカウント キーを生成してください。
gcloud iam service-accounts keys create \
azure-pipelines-publisher.json --iam-account $AZURE_PIPELINES_PUBLISHER
tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
Cloud Shell の右上隅にあるボタンをクリックして、コード エディターを起動してください。
ファイル named azure-pipelines-publisher-oneline.json
を開きます。 このファイルの内容は、次のいずれかの手順で必要になります。
Azure DevOps 組織で、[プロジェクトの設定] を選択し、[パイプライン - >サービス接続] を選択してください。
[新しいサービス接続] を選択し、[Docker レジストリ] 選択してください
ダイアログで、次のフィールドの値を入力してください。
- Docker Registry:
https://gcr.io/[PROJECT-ID]
。ここで、 [PROJECT-ID]
は GCP プロジェクトの名前です。
- Docker ID:
_json_key
- Docker パスワード:
azure-pipelines-publisher-oneline.json
の内容を貼り付けてください
- サービス接続名:
gcrServiceConnection
[保存] を選択してサービス接続を作成してください
Docker イメージをビルドしてプッシュする Azure Pipeline を作成する
Docker@2 タスクは、Azure Pipelines 内で Docker イメージを構築、プッシュ、管理するプロセスを効率化するように設計されています。 このタスクは、ビルド、プッシュ、ログイン、ログアウト、開始、停止、実行など、さまざまな Docker コマンドをサポートしています。
次の手順では、Docker@2 タスクを使用してイメージをビルドしてプッシュする YAML パイプラインを作成する方法について説明します。
Azure DevOps プロジェクトに移動し、左側のメニューから Pipelines を選択します。
新しいパイプラインを選択して新しいパイプラインを作成します。
ソース コードの場所として GitHub または GitHub Enterprise Server を選択します。
まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。
- [GitHub Enterprise Server に接続する] を選択します。
- アカウントの詳細を入力し、[確認して保存] を選択します。
リポジトリを選択します。
GitHub にリダイレクトされる場合
Starter パイプライン テンプレートを選択して、基本的なパイプライン構成を作成します。
azure-pipelines.yml の内容を次のコードに置き換えます。
Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage
をそれぞれ ubuntu-latest
または windows-latest
に設定してください。 セルフホステッド エージェントを使用している場合は、 vmImage
を、Docker 機能を備えたセルフホステッド エージェントを含むプールの名前に設定します。 demands: docker
プロパティを追加して、Docker がインストールされているエージェントが選択されていることを確認できます。
<docker connection>
を、先ほど作成した Docker サービス接続の名前に置き換えます。
<target repository name>
は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、<your-docker-hub-username>/<repository-name>
のようにします。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
repositoryName: '<target repository name>'
steps:
- task: Docker@2
inputs:
containerRegistry: '<docker connection>'
repository: $(repositoryName)
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
完了したら、[保存して実行] を選択します。
azure-pipelines.yml ファイルをリポジトリに保存すると、コミット メッセージを追加するように求められます。 メッセージを入力し、[保存して実行] を選択します。
セルフホステッド エージェントを使用する場合は、エージェントのホストに Docker がインストールされていることと、昇格された特権で Docker エンジン/デーモンが実行されていることを確認します。
イメージをビルドするには、エージェントのホストに Docker をインストールし、Docker エンジン/デーモンを管理者特権で実行する必要があります。 YAML パイプライン エディターを使用してパイプラインを作成するには、次の手順に従います。
コレクションに移動し、プロジェクトを作成します。
プロジェクト内で、[パイプライン] を選択します。
[Create Pipeline] を選択します。
ソース コードの場所として [GitHub Enterprise Server] を選択します。
まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。
- [GitHub Enterprise Server に接続する] を選択します。
- アカウントの詳細を入力し、[確認して保存] を選択します。
リポジトリを選択します。
Azure Pipelines アプリをインストールするために GitHub にリダイレクトされた場合は、[承認してインストール] を選択します。
パイプラインを構成するには、[Docker イメージのビルド] テンプレートを選択します。
YAML パイプラインで、YAML ファイルの内容を次のコードに置き換えます。 プール名を、セルフホステッド エージェントを含むプールの名前に Docker 機能を使用して置き換えます。
Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage
をそれぞれ ubuntu-latest
または windows-latest
に設定してください。
<target repository name>
は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、<your-docker-hub-username>/<repository-name>
のようにします。
<docker connection>
を、先ほど作成した Docker サービス接続の名前に置き換えます。
trigger:
- main
pool:
name: default
demands: docker
variables:
repositoryName: '<target repository name>'
steps:
- task: Docker@2
inputs:
containerRegistry: '<docker connection>'
repository: $(repositoryName)
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
[保存して実行] を選択します。
[保存して実行] ページで、もう一度 [保存して実行] を選択します。
パイプラインの実行を監視し、ログを表示して、Docker イメージがビルドされ、コンテナー レジストリにプッシュされていることを確認できます。
Docker テンプレートを使用して Docker イメージをビルドして Azure コンテナー レジストリにプッシュする YAML パイプラインを作成できます。詳細については、「 Docker YAML を使用して Docker イメージをビルドして Azure Container Registry にプッシュするか 次の手順を使用します。
Docker@2 タスクは、イメージをビルドしてコンテナー レジストリにプッシュするために使用されます。
Docker@2 タスクは、Azure Pipelines 内で Docker イメージを構築、プッシュ、管理するプロセスを効率化するように設計されています。 このタスクは、ビルド、プッシュ、ログイン、ログアウト、開始、停止、実行など、さまざまな Docker コマンドをサポートしています。
次の手順では、Docker@2 タスクを使用してイメージをビルドしてプッシュする YAML パイプラインを作成する方法について説明します。
Azure DevOps プロジェクトに移動し、左側のメニューから Pipelines を選択します。
新しいパイプラインを選択して新しいパイプラインを作成します。
ソース コードの場所として GitHub または GitHub Enterprise Server を選択します。
まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。
- [GitHub Enterprise Server に接続する] を選択します。
- アカウントの詳細を入力し、[確認して保存] を選択します。
リポジトリを選択します。
Starter パイプライン テンプレートを選択して、基本的なパイプライン構成を作成します。
azure-pipelines.yml の内容を次のコードに置き換えます。
Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage
をそれぞれ ubuntu-latest
または windows-latest
に設定してください。 セルフホステッド エージェントを使用している場合は、 vmImage
を、Docker 機能を備えたセルフホステッド エージェントを含むプールの名前に設定します。 demands: docker
プロパティを追加して、Docker がインストールされているエージェントが選択されていることを確認できます。
<docker connection>
を、先ほど作成した Docker サービス接続の名前に置き換えます。
<target repository name>
は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、myregistry.azurecr.io/myimage
のようにします。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
repositoryName: '<target repository name>'
steps:
- task: Docker@2
inputs:
containerRegistry: '<azure resource manager connection>'
repository: $(repositoryName)
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
完了したら、[保存して実行] を選択します。
azure-pipelines.yml ファイルをリポジトリに保存すると、コミット メッセージを追加するように求められます。 メッセージを入力し、[保存して実行] を選択します。
セルフホステッド エージェントを使用する場合は、エージェントのホストに Docker がインストールされていることと、昇格された特権で Docker エンジン/デーモンが実行されていることを確認します。
Azure Container Registry にイメージ化された Docker のプッシュは、Azure DevOps Server ではサポートされていません。
Docker@2 タスクは、Azure Pipelines 内で Docker イメージを構築、プッシュ、管理するプロセスを効率化するように設計されています。 このタスクは、ビルド、プッシュ、ログイン、ログアウト、開始、停止、実行など、さまざまな Docker コマンドをサポートしています。
次の手順では、Docker@2 タスクを使用してイメージをビルドしてプッシュする YAML パイプラインを作成する方法について説明します。
Azure DevOps プロジェクトに移動し、左側のメニューから Pipelines を選択します。
新しいパイプラインを選択して新しいパイプラインを作成します。
ソース コードの場所として GitHub または GitHub Enterprise Server を選択します。
まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。
- [GitHub Enterprise Server に接続する] を選択します。
- アカウントの詳細を入力し、[確認して保存] を選択します。
リポジトリを選択します。
Starter パイプライン テンプレートを選択して、基本的なパイプライン構成を作成します。
azure-pipelines.yml の内容を次のコードに置き換えます。
Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage
をそれぞれ ubuntu-latest
または windows-latest
に設定してください。 セルフホステッド エージェントを使用している場合は、 vmImage
を、Docker 機能を備えたセルフホステッド エージェントを含むプールの名前に設定します。 demands: docker
プロパティを追加して、Docker がインストールされているエージェントが選択されていることを確認できます。
<docker connection>
を、先ほど作成した Docker サービス接続の名前に置き換えます。
<target repository name>
は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、<your-project-id>/<your-image-name>
のようにします。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
repositoryName: '<target repository name>'
steps:
- task: Docker@2
inputs:
containerRegistry: '<docker connection>'
repository: $(repositoryName)
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
完了したら、[保存して実行] を選択します。
azure-pipelines.yml ファイルをリポジトリに保存すると、コミット メッセージを追加するように求められます。 メッセージを入力し、[保存して実行] を選択します。
セルフホステッド エージェントを使用する場合は、エージェントのホストに Docker がインストールされていることと、昇格された特権で Docker エンジン/デーモンが実行されていることを確認します。
イメージをビルドするには、エージェントのホストに Docker をインストールし、Docker エンジン/デーモンを管理者特権で実行する必要があります。 YAML パイプライン エディターを使用してパイプラインを作成するには、次の手順に従います。
コレクションに移動し、プロジェクトを作成します。
プロジェクト内で、[パイプライン] を選択します。
[Create Pipeline] を選択します。
ソース コードの場所として [GitHub Enterprise Server] を選択します。
まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。
- [GitHub Enterprise Server に接続する] を選択します。
- アカウントの詳細を入力し、[確認して保存] を選択します。
リポジトリを選択します。
パイプラインを構成するには、[Docker イメージのビルド] テンプレートを選択します。
YAML パイプラインで、YAML ファイルの内容を次のコードに置き換えます。 プール名を、セルフホステッド エージェントを含むプールの名前に Docker 機能を使用して置き換えます。
Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage
をそれぞれ ubuntu-latest
または windows-latest
に設定してください。
<target repository name>
は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、<your-project-id>/<your-image-name>
のようにします。
<docker connection>
を、先ほど作成した Docker サービス接続の名前に置き換えます。
trigger:
- main
pool:
name: default
demands: docker
variables:
repositoryName: '<target repository name>'
steps:
- task: Docker@2
inputs:
containerRegistry: '<docker connection>'
repository: $(repositoryName)
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
[保存して実行] を選択します。
[保存して実行] ページで、もう一度 [保存して実行] を選択します。
パイプラインの実行を監視し、ログを表示して、Docker イメージがビルドされ、コンテナー レジストリにプッシュされていることを確認できます。
Docker@2 タスクでの認証に System.AccessToken を使用する
Azure DevOps によって提供される System.AccessToken
を使用して、コンテナー レジストリで認証できます。 このトークンを使用すると、機密性の高い資格情報を公開することなく、パイプライン内のリソースに安全にアクセスできます。
次の YAML パイプラインの例では、Docker@2 タスクを使用してコンテナー レジストリにサインインし、Docker イメージをプッシュします。 System.AccessToken
は、Docker コマンドを認証するための環境変数として設定されます。
<docker connection>
を Docker レジストリ サービスの接続名に置き換えます。
<your repository>
を Docker リポジトリの名前に置き換えます。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
steps:
- task: Docker@2
inputs:
command: login
containerRegistry: '<docker connection>'
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- task: Docker@2
inputs:
command: buildAndPush
repository: '<your repository>'
dockerfile: '**/Dockerfile'
tags: |
$(Build.BuildId)
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
関連記事