使用 Docker 簡介 Azure Pipelines

本指南由社群貢獻。Docker 感謝 Kristiyan Velkov 的寶貴貢獻。

先決條件

開始之前,請確保您已具備以下必要條件

概覽

本指南將引導您使用 Azure Pipelines 建置並推送 Docker 映像,為容器化應用程式打造流暢且安全的 CI 工作流程。您將學會如何:

  • 安全地設定 Docker 身份驗證。
  • 建立自動化管線以建置並推送映像。

設定 Azure DevOps 以與 Docker Hub 協作

步驟 1:設定 Docker Hub 服務連線

若要使用 Azure Pipelines 安全地進行 Docker Hub 身份驗證

  1. 前往 Azure DevOps 專案中的 專案設定 (Project Settings) > 服務連線 (Service Connections)
  2. 選擇 新增服務連線 (New service connection) > Docker Registry
  3. 選擇 Docker Hub 並提供您的 Docker Hub 憑證或存取權杖。
  4. 為服務連線取一個易於辨識的名稱,例如 my-docker-registry
  5. 僅授予需要此連線的特定管線存取權,以提高安全性並落實最小權限原則。
重要

除非絕對必要,否則請避免選擇授予所有管線存取權的選項。務必應用最小權限原則。

步驟 2:建立您的管線

將以下 azure-pipelines.yml 檔案新增至您的儲存庫根目錄

# Trigger pipeline on commits to the main branch
trigger:
  - main

# Trigger pipeline on pull requests targeting the main branch
pr:
  - main

# Define variables for reuse across the pipeline
variables:
  imageName: 'docker.io/$(dockerUsername)/my-image'
  buildTag: '$(Build.BuildId)'
  latestTag: 'latest'

stages:
  - stage: BuildAndPush
    displayName: Build and Push Docker Image
    jobs:
      - job: DockerJob
        displayName: Build and Push
        pool:
          vmImage: ubuntu-latest
          demands:
            - docker
        steps:
          - checkout: self
            displayName: Checkout Code

          - task: Docker@2
            displayName: Docker Login
            inputs:
              command: login
              containerRegistry: 'my-docker-registry'  # Service connection name

          - task: Docker@2
            displayName: Build Docker Image
            inputs:
              command: build
              repository: $(imageName)
              tags: |
                $(buildTag)
                $(latestTag)
              dockerfile: './Dockerfile'
              arguments: |
                --sbom=true
                --attest type=provenance
                --cache-from $(imageName):latest
            env:
              DOCKER_BUILDKIT: 1

          - task: Docker@2
            displayName: Push Docker Image
            condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
            inputs:
              command: push
              repository: $(imageName)
              tags: |
                $(buildTag)
                $(latestTag)

          # Optional: logout for self-hosted agents
          - script: docker logout
            displayName: Docker Logout (Self-hosted only)
            condition: ne(variables['Agent.OS'], 'Windows_NT')

此管線的功能

此管線可自動化 main 分支的 Docker 映像建置與部署流程。它透過快取、標記和條件式清理等最佳實務,確保工作流程既安全又高效。其功能如下:

  • 針對目標為 main 分支的提交與提取請求 (Pull Request) 進行觸發。
  • 使用 Azure DevOps 服務連線安全地進行 Docker Hub 身份驗證。
  • 使用 Docker BuildKit 建置並標記 Docker 映像,以進行快取。
  • 將 buildId 與 latest 標籤推送至 Docker Hub。
  • 若在自託管的 Linux 代理程式上執行,將會從 Docker 登出。

管線運作原理

步驟 1:定義管線觸發程序

trigger:
  - main

pr:
  - main

此管線會在以下情況自動觸發:

  • 推送到 main 分支的提交
  • 針對 main 分支的提取請求
提示

步驟 2:定義通用變數

variables:
  imageName: 'docker.io/$(dockerUsername)/my-image'
  buildTag: '$(Build.BuildId)'
  latestTag: 'latest'

這些變數可確保在整個管線步驟中維持一致的命名、版本控制與重複使用性:

  • imageName:您在 Docker Hub 上的映像路徑
  • buildTag:每次管線執行的唯一標籤
  • latestTag:您最新映像的穩定別名
重要

變數 dockerUsername 不會自動設定。
請在您的 Azure DevOps 管線變數中安全地設定它:

  1. 前往 管線 (Pipelines) > 編輯 (Edit) > 變數 (Variables)
  2. 新增 dockerUsername 並輸入您的 Docker Hub 使用者名稱

深入了解:在 Azure Pipelines 中定義與使用變數

步驟 3:定義管線階段與作業

stages:
  - stage: BuildAndPush
    displayName: Build and Push Docker Image

此階段僅在來源分支為 main 時執行。

提示

步驟 4:作業設定

jobs:
  - job: DockerJob
  displayName: Build and Push
  pool:
    vmImage: ubuntu-latest
    demands:
      - docker

此作業使用由 Microsoft 託管的代理程式所提供的最新 Ubuntu VM 映像(包含 Docker 支援)。如有必要,可更換為自託管代理程式的自訂集區。

提示

步驟 4.1:簽出程式碼 (Checkout code)

steps:
  - checkout: self
    displayName: Checkout Code

此步驟將您的儲存庫程式碼拉取至建置代理程式,讓管線能夠存取 Dockerfile 與應用程式檔案。

提示

步驟 4.2:驗證 Docker Hub

- task: Docker@2
  displayName: Docker Login
  inputs:
    command: login
    containerRegistry: 'my-docker-registry'  # Replace with your service connection name

使用預先設定的 Azure DevOps Docker 登錄檔服務連線進行安全驗證,無需直接暴露憑證。

提示

步驟 4.3:建置 Docker 映像

 - task: Docker@2
    displayName: Build Docker Image
    inputs:
      command: build
      repository: $(imageName)
      tags: |
          $(buildTag)
          $(latestTag)
      dockerfile: './Dockerfile'
      arguments: |
          --sbom=true
          --attest type=provenance
          --cache-from $(imageName):latest
    env:
      DOCKER_BUILDKIT: 1

此步驟以以下方式建置映像:

  • 兩個標籤:一個使用唯一的建置 ID,另一個標記為 latest
  • 啟用 Docker BuildKit 以加速建置並提高層級快取效率
  • 從最近推送的 latest 映像中提取快取
  • 軟體物料清單 (SBOM),以確保供應鏈透明度
  • 來源證明 (Provenance attestation),以驗證映像的建置方式與位置
提示

步驟 4.4:推送 Docker 映像

- task: Docker@2
  displayName: Push Docker Image
  condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
  inputs:
      command: push
      repository: $(imageName)
      tags: |
        $(buildTag)
        $(latestTag)

透過應用此條件,管線會在每次執行時建置 Docker 映像以確保儘早發現問題,但僅在變更合併至 main 分支時才將映像推送至登錄檔,藉此保持 Docker Hub 的整潔與專注。

這會將兩個標籤上傳至 Docker Hub:

  • $(buildTag) 確保每次執行的可追溯性。
  • latest 用於參考最新映像。

步驟 4.5 登出 Docker(適用於自託管代理程式)

- script: docker logout
  displayName: Docker Logout (Self-hosted only)
  condition: ne(variables['Agent.OS'], 'Windows_NT')

在管線結束時,於 Linux 的自託管代理程式上執行 docker logout,以主動清除憑證並增強安全性。

總結

透過此 Azure Pipelines CI 設定,您可以獲得:

  • 使用內建服務連線進行安全的 Docker 身份驗證。
  • 由程式碼變更觸發的自動化映像建置與標記。
  • 利用 Docker BuildKit 快取的高效建置。
  • 在持續執行的代理程式上進行安全的登出清理。
  • 建置符合現代軟體供應鏈要求的映像,並附帶 SBOM 與證明。

了解更多

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.