次の方法で共有


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 のサービス接続を作成するには、さまざまなプロセスがあります。

[Docker レジストリ サービス接続] で [Docker Hub] オプションを選択し、ユーザー名とパスワードを指定して Docker サービス接続を作成してください。

Docker イメージをビルドしてプッシュする Azure Pipeline を作成する

Docker@2 タスクは、Azure Pipelines 内で Docker イメージを構築、プッシュ、管理するプロセスを効率化するように設計されています。 このタスクは、ビルド、プッシュ、ログイン、ログアウト、開始、停止、実行など、さまざまな Docker コマンドをサポートしています。

次の手順では、Docker@2 タスクを使用してイメージをビルドしてプッシュする YAML パイプラインを作成する方法について説明します。

  1. Azure DevOps プロジェクトに移動し、左側のメニューから Pipelines を選択します。

  2. 新しいパイプラインを選択して新しいパイプラインを作成します。

  3. ソース コードの場所として GitHub または GitHub Enterprise Server を選択します。

  4. まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。

    1. [GitHub Enterprise Server に接続する] を選択します。
    2. アカウントの詳細を入力し、[確認して保存] を選択します。
  5. リポジトリを選択します。 GitHub にリダイレクトされる場合

  6. Starter パイプライン テンプレートを選択して、基本的なパイプライン構成を作成します。

  7. azure-pipelines.yml の内容を次のコードに置き換えます。

  8. Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage をそれぞれ ubuntu-latest または windows-latest に設定してください。 セルフホステッド エージェントを使用している場合は、 vmImage を、Docker 機能を備えたセルフホステッド エージェントを含むプールの名前に設定します。 demands: docker プロパティを追加して、Docker がインストールされているエージェントが選択されていることを確認できます。

  9. <docker connection>を、先ほど作成した Docker サービス接続の名前に置き換えます。

  10. <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'
    
    
  11. 完了したら、[保存して実行] を選択します。

  12. azure-pipelines.yml ファイルをリポジトリに保存すると、コミット メッセージを追加するように求められます。 メッセージを入力し、[保存して実行] を選択します。

セルフホステッド エージェントを使用する場合は、エージェントのホストに Docker がインストールされていることと、昇格された特権で Docker エンジン/デーモンが実行されていることを確認します。

イメージをビルドするには、エージェントのホストに Docker をインストールし、Docker エンジン/デーモンを管理者特権で実行する必要があります。 YAML パイプライン エディターを使用してパイプラインを作成するには、次の手順に従います。

  1. コレクションに移動し、プロジェクトを作成します。

  2. プロジェクト内で、[パイプライン] を選択します。

  3. [Create Pipeline] を選択します。

  4. ソース コードの場所として [GitHub Enterprise Server] を選択します。

  5. まだであれば、GitHub Enterprise Server アカウントに接続する Azure Pipelines を承認します。

    1. [GitHub Enterprise Server に接続する] を選択します。
    2. アカウントの詳細を入力し、[確認して保存] を選択します。
  6. リポジトリを選択します。 Azure Pipelines アプリをインストールするために GitHub にリダイレクトされた場合は、[承認してインストール] を選択します。

  7. パイプラインを構成するには、[Docker イメージのビルド] テンプレートを選択します。

  8. YAML パイプラインで、YAML ファイルの内容を次のコードに置き換えます。 プール名を、セルフホステッド エージェントを含むプールの名前に Docker 機能を使用して置き換えます。

  9. Linux と Windows のどちらのアプリをデプロイするかに基づいて、必ず、vmImage をそれぞれ ubuntu-latest または windows-latest に設定してください。

  10. <target repository name>は、イメージをプッシュするコンテナー レジストリ内のリポジトリの名前に置き換えます。 たとえば、<your-docker-hub-username>/<repository-name> のようにします。

  11. <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'
    
    
  12. [保存して実行] を選択します。

  13. [保存して実行] ページで、もう一度 [保存して実行] を選択します。

パイプラインの実行を監視し、ログを表示して、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)